2015-08-16 82 views
1

我是Android的初學者。所以,我點擊一個AlertDialog應該出現的圖標。簡單.----機器人:的onClick = 「onCreateDialog」 ----創建AlertDialog時出錯

package com.example.android.guardian; 

import android.app.AlertDialog; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.os.Bundle; 
import android.support.v7.app.ActionBarActivity; 
import android.view.LayoutInflater; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.ImageView; 


public class MainActivity extends ActionBarActivity { 

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

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_settings) { 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 

    public void onCreateDialog(View v) { 
     ImageView image = (ImageView) findViewById(R.id.g_icon); 
     image.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       AlertDialog.Builder builder = new AlertDialog.Builder(getApplicationContext()); 
       // Get the layout inflater 
       LayoutInflater inflater = builder.getLayoutInflater(); 

       // Inflate and set the layout for the dialog 
       // Pass null as the parent view because its going in the dialog layout 
       builder.setView(inflater.inflate(R.layout.activity_g_pass, null)) 
         // Add action buttons 
         .setPositiveButton(R.string.SavePass, new DialogInterface.OnClickListener() { 
          @Override 
          public void onClick(DialogInterface dialog, int id) { 
           // sign in the user ... 
          } 
         }) 
         .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog, int id) { 
          } 
         }); 
       builder.create(); 
      } 

     }); 

    } 
} 

上面的代碼是象的骨架。沒有細節。我想單擊時實現上述功能,即打開AlertDialog。它說無法解決getLayoutInflater()方法的strings.xml

<string name="hello_world">Hello world!</string> 
<string name="action_settings">Settings</string> 
<string name="title_activity_g_pass">Google</string> 
<string name = "cancel">Cancel</string> 
<string name = "savePass">Save</string> 

這是logcat的

08-17 01:34:22.430 26909-26909/com.example.android.guardian E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: com.example.android.guardian, PID: 26909 
    java.lang.IllegalStateException: Could not execute method of the activity 
      at android.view.View$1.onClick(View.java:3829) 
      at android.view.View.performClick(View.java:4444) 
      at android.view.View$PerformClick.run(View.java:18457) 
      at android.os.Handler.handleCallback(Handler.java:733) 
      at android.os.Handler.dispatchMessage(Handler.java:95) 
      at android.os.Looper.loop(Looper.java:136) 
      at android.app.ActivityThread.main(ActivityThread.java:5047) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:515) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:609) 
      at dalvik.system.NativeStart.main(Native Method) 
    Caused by: java.lang.reflect.InvocationTargetException 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:515) 
      at android.view.View$1.onClick(View.java:3824) 
            at android.view.View.performClick(View.java:4444) 
            at android.view.View$PerformClick.run(View.java:18457) 
            at android.os.Handler.handleCallback(Handler.java:733) 
            at android.os.Handler.dispatchMessage(Handler.java:95) 
            at android.os.Looper.loop(Looper.java:136) 
            at android.app.ActivityThread.main(ActivityThread.java:5047) 
            at java.lang.reflect.Method.invokeNative(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:515) 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:609) 
            at dalvik.system.NativeStart.main(Native Method) 
    Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application 
      at android.view.ViewRootImpl.setView(ViewRootImpl.java:563) 
      at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:260) 
      at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69) 
      at android.app.Dialog.show(Dialog.java:286) 
      at com.example.android.guardian.MainActivity.onCreateDialog(MainActivity.java:60) 
            at java.lang.reflect.Method.invokeNative(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:515) 
            at android.view.View$1.onClick(View.java:3824) 
            at android.view.View.performClick(View.java:4444) 
            at android.view.View$PerformClick.run(View.java:18457) 
            at android.os.Handler.handleCallback(Handler.java:733) 
            at android.os.Handler.dispatchMessage(Handler.java:95) 
            at android.os.Looper.loop(Looper.java:136) 
            at android.app.ActivityThread.main(ActivityThread.java:5047) 
            at java.lang.reflect.Method.invokeNative(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:515) 

清單XML

<?xml version="1.0" encoding="utf-8"?> 

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <activity 
     android:name=".MainActivity" 
     android:label="@string/app_name"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <activity 
     android:name=".g_pass" 
     android:label="@string/title_activity_g_pass" 
     android:parentActivityName=".MainActivity"> 
     <meta-data 
      android:name="android.support.PARENT_ACTIVITY" 
      android:value="com.example.android.guardian.MainActivity" /> 
    </activity> 
</application> 

+0

您是否想在點擊該圖像視圖時打開該對話框? –

+0

完全發佈你的兩個xml。您已經發布了一些我想要查看的imageView,但您有兩個活動,您是在哪一個活動中編寫imageView的?此外,爲什麼要將AlertDialog的活動佈局擴展到同一個佈局?它應該是不同的。 –

+0

你解決了你的問題嗎?它應該工作。確保你的AlertDialog中的其他視圖膨脹。不要誇大AlertDialog中的activity_main,並且已經將其誇大了... –

回答

2

這種替換:

public void onCreateDialog(View v) { 
    AlertDialog.Builder builder = new AlertDialog.Builder(this); 
    LayoutInflater inflater = this.getLayoutInflater(); 
    View view = inflater.inflate(R.layout.activity_main, null); 
    builder.setView(view); 
    builder.setPositiveButton(R.string.savePass, new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int id) { 
       // sign in the user ... 
      } 
     }); 
    builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int id) { 
      } 
     }); 
    AlertDialog dialog = builder.create(); 
    dialog.show(); 
    } 
} 

點擊一個ImageView的時候這將打開一個AlertDialog。在XML文件在您的ImageView的是,添加:

安卓的onClick = 「onCreateDialog」

機器人:可點擊= 「真」

然後轉到您的strings.xml和將字符串「SavePass」更改爲「savePass」。

+0

謝謝。但問題仍然存在。無法解析getLayoutInflater()方法 – Atom

+0

更新了答案,檢查它。 –

+0

工作。你能解釋一下你剛剛編輯的代碼嗎? – Atom