2015-08-16 63 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