0

Cámara と Galería の 2 つのオプションで AlertDialog を見ようとしています。しかし、アプリを実行すると、「残念ながら、MapaLugares は終了しました」というメッセージが表示されて終了します。

logcat メッセージは次のとおりです。

08-15 20:37:02.960: E/AndroidRuntime(5377): FATAL EXCEPTION: main
08-15 20:37:02.960: E/AndroidRuntime(5377):  
android.view.WindowManager$BadTokenException: Unable to add window -- token null is   
not for an application
08-15 20:37:02.960: E/AndroidRuntime(5377):         at  
android.view.ViewRootImpl.setView(ViewRootImpl.java:521)
08-15 20:37:02.960: E/AndroidRuntime(5377):     at 
android.view.WindowManagerImpl.addView(WindowManagerImpl.java:301)
08-15 20:37:02.960: E/AndroidRuntime(5377):     at 
android.view.WindowManagerImpl.addView(WindowManagerImpl.java:215)
08-15 20:37:02.960: E/AndroidRuntime(5377):     at 
android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:140)
08-15 20:37:02.960: E/AndroidRuntime(5377):     at  
android.app.Dialog.show(Dialog.java:289)
08-15 20:37:02.960: E/AndroidRuntime(5377):     at 
com.app.mapa.Insertarlugar$1.onClick(Insertarlugar.java:62)
08-15 20:37:02.960: E/AndroidRuntime(5377):     at  
android.view.View.performClick(View.java:3521)
08-15 20:37:02.960: E/AndroidRuntime(5377):     at 
android.view.View$PerformClick.run(View.java:14185)
08-15 20:37:02.960: E/AndroidRuntime(5377):     at 
android.os.Handler.handleCallback(Handler.java:605)
08-15 20:37:02.960: E/AndroidRuntime(5377):     at 
android.os.Handler.dispatchMessage(Handler.java:92)
08-15 20:37:02.960: E/AndroidRuntime(5377):     at 
android.os.Looper.loop(Looper.java:137)
08-15 20:37:02.960: E/AndroidRuntime(5377):     at 
android.app.ActivityThread.main(ActivityThread.java:4464)
08-15 20:37:02.960: E/AndroidRuntime(5377):     at 
java.lang.reflect.Method.invokeNative(Native Method)
08-15 20:37:02.960: E/AndroidRuntime(5377):     at 
java.lang.reflect.Method.invoke(Method.java:511)
08-15 20:37:02.960: E/AndroidRuntime(5377):     at 
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:822)
08-15 20:37:02.960: E/AndroidRuntime(5377):     at 
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:589)
08-15 20:37:02.960: E/AndroidRuntime(5377):     at 
dalvik.system.NativeStart.main(Native Method)
08-15 20:37:05.210: I/ActivityThread(5573): Pub com.app.mapa.MCProvider:   
com.app.mapa.MCProvider
08-15 20:37:05.570: D/memalloc(5573): /dev/pmem: Mapped buffer base:0x5127b000 
size:2826240 offset:1290240 fd:51
08-15 20:37:05.620: E/Adreno200-ES20(5573): <qgl2DrvAPI_glUseProgram:1318>: **** 5573: 
glUseProgram(3)
08-15 20:37:05.650: E/Adreno200-ES20(5573): <qgl2DrvAPI_glUseProgram:1318>: **** 5573: 
glUseProgram(6)
08-15 20:37:05.670: D/memalloc(5573): /dev/pmem: Mapped buffer base:0x516f7000 
size:4362240 offset:2826240 fd:58

コード:

public class Insertarlugar extends Activity {


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_insertarlugar);

    ImageButton imgbutton;

    imgbutton = (ImageButton) findViewById(R.id.imgButton);
    EditText titlugar; 
    EditText desclugar;
            titlugar = (EditText) findViewById(R.id.edit_titulo_lugar);
    String tlugar = titlugar.getText().toString();

    desclugar = (EditText) findViewById(R.id.edit_descripcion_lugar);
    String dlugar = desclugar.getText().toString();

    imgbutton.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
                       final String[] items = {"Cámara", "Galería"};

             AlertDialog.Builder builder = new 
                     AlertDialog.Builder(getApplicationContext());
             builder.setTitle("Foto");
             builder.setItems(items, new DialogInterface.OnClickListener() {
                 public void onClick(DialogInterface dialog, int item) {

                     Toast.makeText(Insertarlugar.this, "Click\n" + item, 
                             Toast.LENGTH_SHORT).show();
                 }
             });
             AlertDialog alert = builder.create();
             alert.show();

         } 
});
}

どうしたの?

ありがとう。

4

2 に答える 2

1

この行を変更

AlertDialog.Builder(getApplicationContext());

AlertDialog.Builder(Insertarlugar.this);

Dialogは で作成されるため、アプリケーションの ではなく、それActivityを使用して作成します。私が理解している限り、これはほとんどのオブジェクトに当てはまります。これは などの一部のオブジェクトで機能する場合もありますが、私の意見では、ここでは'sである正しいものを試して使用することを常にお勧めします。ContextContextUIContextToastContextActivity

どちらをいつ使用するかについては、この回答を参照してくださいContext

于 2013-08-15T20:50:05.957 に答える
1

他の人がコメントで述べたように、あなたの文脈は間違っています。ありがたいことに、これはView.getContext()メソッドを使用して簡単に修正できます。

    public void onClick(View arg0) {
                   final String[] items = {"Cámara", "Galería"};

         AlertDialog.Builder builder = new 
                 AlertDialog.Builder(arg0.getContext());
         builder.setTitle("Foto");
         builder.setItems(items, new DialogInterface.OnClickListener() {
             public void onClick(DialogInterface dialog, int item) {

                 Toast.makeText(Insertarlugar.this, "Click\n" + item, 
                         Toast.LENGTH_SHORT).show();
             }
         });
         AlertDialog alert = builder.create();
         alert.show();

     } 
于 2013-08-15T20:50:50.783 に答える