Ninguém consegue me ajudar? Acho que é o quarto ou quinto tópico que posto no GUJ que ninguém ajuda.
Eu tentei chamar métodos da classe MainActivity, dentro da classe ImagemOverlay (mais especificamente, dentro do evento onTap desta classe), através da linha de código abaixo:
MainActivity m = new MainActivity();
m.chamaBandeira(shortname, address, phoneFormat(phone), flagname);
Mas toda vez que eu chamava tal método, cujo corpo é:
public void chamaBandeira(String shortname, String address, String phone, String flagname) {
Log.i("map", "[MainActivity].chamaBandeira() -> Shortname: " + shortname + ", Address: " + address + ", Phone: " + phone + ", Flagname: " + flagname);
Intent it = new Intent(this, BandeiraActivity.class);
it.putExtra("shortname", shortname);
it.putExtra("address", address);
it.putExtra("phone", phone);
it.putExtra("flagname", flagname);
startActivity(it);
}
Acarretava o seguinte erro:
[list]04-08 18:59:07.749: I/map(518 ): [MainActivity].chamaBandeira() -> Shortname: NOVO HAMBURGO, Address: Rua Joaquim Pedro Soares 339 , Phone: [telefone removido], Flagname: You Move
04-08 18:59:07.749: D/AndroidRuntime(518 ): Shutting down VM
04-08 18:59:07.749: W/dalvikvm(518 ): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
04-08 18:59:07.769: E/AndroidRuntime(518 ): FATAL EXCEPTION: main
04-08 18:59:07.769: E/AndroidRuntime(518 ): java.lang.NullPointerException
04-08 18:59:07.769: E/AndroidRuntime(518 ): at android.content.ContextWrapper.getPackageName(ContextWrapper.java:120)
04-08 18:59:07.769: E/AndroidRuntime(518 ): at android.content.ComponentName.(ComponentName.java:75)
04-08 18:59:07.769: E/AndroidRuntime(518 ): at android.content.Intent.(Intent.java:2678 )
04-08 18:59:07.769: E/AndroidRuntime(518 ): at br.mindset.android.unidades.mapa.Menu.info(Menu.java:31)
04-08 18:59:07.769: E/AndroidRuntime(518 ): at br.mindset.android.unidades.mapa.TesteOverlay.onTap(TesteOverlay.java:69)
04-08 18:59:07.769: E/AndroidRuntime(518 ): at com.google.android.maps.OverlayBundle.onTap(OverlayBundle.java:83)
04-08 18:59:07.769: E/AndroidRuntime(518 ): at com.google.android.maps.MapView$1.onSingleTapUp(MapView.java:347)
04-08 18:59:07.769: E/AndroidRuntime(518 ): at com.google.android.maps.GestureDetector.onTouchEvent(GestureDetector.java:533)
04-08 18:59:07.769: E/AndroidRuntime(518 ): at com.google.android.maps.MapView.onTouchEvent(MapView.java:647)
04-08 18:59:07.769: E/AndroidRuntime(518 ): at android.view.View.dispatchTouchEvent(View.java:3766)
04-08 18:59:07.769: E/AndroidRuntime(518 ): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:897)
04-08 18:59:07.769: E/AndroidRuntime(518 ): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
04-08 18:59:07.769: E/AndroidRuntime(518 ): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
04-08 18:59:07.769: E/AndroidRuntime(518 ): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
04-08 18:59:07.769: E/AndroidRuntime(518 ): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
04-08 18:59:07.769: E/AndroidRuntime(518 ): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1671)
04-08 18:59:07.769: E/AndroidRuntime(518 ): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107)
04-08 18:59:07.769: E/AndroidRuntime(518 ): at android.app.Activity.dispatchTouchEvent(Activity.java:2086)
04-08 18:59:07.769: E/AndroidRuntime(518 ): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1655)
04-08 18:59:07.769: E/AndroidRuntime(518 ): at android.view.ViewRoot.handleMessage(ViewRoot.java:1785)
04-08 18:59:07.769: E/AndroidRuntime(518 ): at android.os.Handler.dispatchMessage(Handler.java:99)
04-08 18:59:07.769: E/AndroidRuntime(518 ): at android.os.Looper.loop(Looper.java:123)
04-08 18:59:07.769: E/AndroidRuntime(518 ): at android.app.ActivityThread.main(ActivityThread.java:4627)
04-08 18:59:07.769: E/AndroidRuntime(518 ): at java.lang.reflect.Method.invokeNative(Native Method)
04-08 18:59:07.769: E/AndroidRuntime(518 ): at java.lang.reflect.Method.invoke(Method.java:521)
04-08 18:59:07.769: E/AndroidRuntime(518 ): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868 )
04-08 18:59:07.769: E/AndroidRuntime(518 ): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
04-08 18:59:07.769: E/AndroidRuntime(518 ): at dalvik.system.NativeStart.main(Native Method)[/list]
Quando postei pela primeira vez neste tópico, minha abordagem era, quando a bandeirinha (Overlay) fosse clicada, um Toast seria aberto, informando ao usuário informações sobre o estabelecimento (nome, endereço e telefone). Porém, meu chefe pediu para incluir neste Toast um botão que, quando clicado, realizasse a ligação para o telefone mostrado no Toast. O problema é que quando o botão é mostrado no Toast, não se pode clicar neste, pois o Toast é uma estrutura temporária. Mesmo setando Toast.LENGTH_LONG, não consigo clicar no botão.
Então, para este novo tópico, decidi mudar minha abordagem, criando um XML (chamado flag.xml) que contivesse a seguinte estrutura:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:orientation="vertical">
<ImageView android:layout_width="fill_parent" android:layout_height="fill_parent"
android:id="@+id/flag" android:layout_gravity="center"/>
<TextView android:layout_width="fill_parent" android:layout_height="fill_parent"
android:id="@+id/txtShortname" android:text="@string/shortname"
android:gravity="center"/>
<TextView android:layout_width="fill_parent" android:layout_height="fill_parent"
android:id="@+id/txtAddress" android:text="@string/address"
android:gravity="center"/>
<TextView android:layout_width="fill_parent" android:layout_height="fill_parent"
android:id="@+id/txtPhone" android:text="@string/phone"
android:gravity="center"/>
<Button android:layout_width="0dip" android:layout_height="fill_parent"
android:id="@+id/btnLigar" android:contentDescription="@string/txtLigar"/>
</LinearLayout>
Logo, quando o botão fosse clicado, não mais um Toast seria jogado na tela, mas sim o método chamaBandeira (da classe MainActivity) seria chamado. Em chamaBandeira seria chamada a tela BandeiraActivity, que implementaria a flag.xml. Logo, quando a bandeira fosse clicada, seria mostrada a tela BandeiraActivity. Porém, quando clico na bandeirinha, o erro já reportado acima é mostrado, como se fosse proibido chamar uma Activity a partir de outra classe.
Alguém conhece uma outra técnica para eu conseguir disponibilizar o tal botão, para que eu possa fazer a ligação para o telefone do estabelecimento?