2011-06-05 66 views
3

我试图将自定义对话框类型添加到Android应用程序,但是每当我按下应该调出对话框的按钮时,我都会得到一个关闭力。当为自定义对话框膨胀视图时发生ClassCastException

从力闭合日志输出如下:

06-05 22:53:28.413: ERROR/AndroidRuntime(187): Uncaught handler: thread main exiting due to uncaught exception 
06-05 22:53:28.453: ERROR/AndroidRuntime(187): java.lang.IllegalStateException: Could not execute method of the activity 
06-05 22:53:28.453: ERROR/AndroidRuntime(187):  at android.view.View$1.onClick(View.java:2027) 
06-05 22:53:28.453: ERROR/AndroidRuntime(187):  at android.view.View.performClick(View.java:2344) 
06-05 22:53:28.453: ERROR/AndroidRuntime(187):  at android.view.View.onTouchEvent(View.java:4133) 
06-05 22:53:28.453: ERROR/AndroidRuntime(187):  at android.widget.TextView.onTouchEvent(TextView.java:6510) 
06-05 22:53:28.453: ERROR/AndroidRuntime(187):  at android.view.View.dispatchTouchEvent(View.java:3672) 
06-05 22:53:28.453: ERROR/AndroidRuntime(187):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:882) 
06-05 22:53:28.453: ERROR/AndroidRuntime(187):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:882) 
06-05 22:53:28.453: ERROR/AndroidRuntime(187):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:882) 
06-05 22:53:28.453: ERROR/AndroidRuntime(187):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:882) 
06-05 22:53:28.453: ERROR/AndroidRuntime(187):  at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1712) 
06-05 22:53:28.453: ERROR/AndroidRuntime(187):  at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1202) 
06-05 22:53:28.453: ERROR/AndroidRuntime(187):  at android.app.Activity.dispatchTouchEvent(Activity.java:1987) 
06-05 22:53:28.453: ERROR/AndroidRuntime(187):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1696) 
06-05 22:53:28.453: ERROR/AndroidRuntime(187):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1658) 
06-05 22:53:28.453: ERROR/AndroidRuntime(187):  at android.os.Handler.dispatchMessage(Handler.java:99) 
06-05 22:53:28.453: ERROR/AndroidRuntime(187):  at android.os.Looper.loop(Looper.java:123) 
06-05 22:53:28.453: ERROR/AndroidRuntime(187):  at android.app.ActivityThread.main(ActivityThread.java:4203) 
06-05 22:53:28.453: ERROR/AndroidRuntime(187):  at java.lang.reflect.Method.invokeNative(Native Method) 
06-05 22:53:28.453: ERROR/AndroidRuntime(187):  at java.lang.reflect.Method.invoke(Method.java:521) 
06-05 22:53:28.453: ERROR/AndroidRuntime(187):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791) 
06-05 22:53:28.453: ERROR/AndroidRuntime(187):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549) 
06-05 22:53:28.453: ERROR/AndroidRuntime(187):  at dalvik.system.NativeStart.main(Native Method) 
06-05 22:53:28.453: ERROR/AndroidRuntime(187): Caused by: java.lang.reflect.InvocationTargetException 
06-05 22:53:28.453: ERROR/AndroidRuntime(187):  at nocom.autophage.bikecalc.BikeCalcMainMenu.showAddMeasurementDialog(BikeCalcMainMenu.java:69) 
06-05 22:53:28.453: ERROR/AndroidRuntime(187):  at java.lang.reflect.Method.invokeNative(Native Method) 
06-05 22:53:28.453: ERROR/AndroidRuntime(187):  at java.lang.reflect.Method.invoke(Method.java:521) 
06-05 22:53:28.453: ERROR/AndroidRuntime(187):  at android.view.View$1.onClick(View.java:2022) 
06-05 22:53:28.453: ERROR/AndroidRuntime(187):  ... 21 more 
06-05 22:53:28.453: ERROR/AndroidRuntime(187): Caused by: java.lang.ClassCastException: android.widget.Button 
06-05 22:53:28.453: ERROR/AndroidRuntime(187):  at nocom.autophage.bikecalc.BikeCalcMainMenu.onCreateDialog(BikeCalcMainMenu.java:48) 
06-05 22:53:28.453: ERROR/AndroidRuntime(187):  at android.app.Activity.createDialog(Activity.java:867) 
06-05 22:53:28.453: ERROR/AndroidRuntime(187):  at android.app.Activity.showDialog(Activity.java:2408) 
06-05 22:53:28.453: ERROR/AndroidRuntime(187):  ... 25 more 

这是创造对话的代码如下所示: 情况下DIALOG_ADD_MEASUREMENT: AlertDialog.Builder addMeasurementBuilder;

 Context mContext = getApplicationContext(); 
     LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(LAYOUT_INFLATER_SERVICE); 
     View layout = inflater.inflate(R.layout.add_measurement_dialog, 
             (ViewGroup) findViewById(R.id.add_measurement_dialog)); 
     addMeasurementBuilder = new AlertDialog.Builder(mContext); 
     addMeasurementBuilder.setView(layout); 
     dialog = addMeasurementBuilder.create(); 
     break; 

和XML(这是我最有信心的部分)的对话是:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:orientation="vertical" 
android:id="@+id/add_measurement_dialog"> 

<TextView 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:text="@string/add_measurement_dialog_title" /> 

<Spinner 
android:id="@+id/add_measurement_spinner" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:prompt="@string/add_measurement_prompt" /> 

<EditText 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:id="@+id/add_measurement_value" /> 

<Button 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:gravity="center_horizontal" 
android:text="@string/calc" 
android:onClick="showFeatureNotYetImplementedToast" /> 

<LinearLayout 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:gravity="center_horizontal"> 

    <Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:gravity="center_horizontal" 
    android:text="@string/cancel" 
    android:onClick="showFeatureNotYetImplementedToast" /> 

    <Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:gravity="center_horizontal" 
    android:text="@string/add" 
    android:onClick="showFeatureNotYetImplementedToast" /> 

</LinearLayout> 

</LinearLayout> 

我能想到的唯一的事情是,也许我不应该使用对话框的xml根元素的id作为视图组...但是我无法弄清楚我还会在inflater调用中放置什么。

编辑:和BikeCalcMainMenu.java的完整内容: 包nocom.autophage.bikecalc;

import android.app.Activity; 
import android.app.AlertDialog; 
import android.app.Dialog; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.Toast; 

public class BikeCalcMainMenu extends Activity { 
    /** Called when the activity is first created. */ 

    static final int DIALOG_HELP = 0; 
    static final int DIALOG_ADD_MEASUREMENT = 1; 

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

    protected Dialog onCreateDialog(int id) { 
     Dialog dialog; 
     switch(id) { 
     case DIALOG_HELP: 
      AlertDialog.Builder helpBuilder = new AlertDialog.Builder(this); 
      helpBuilder.setMessage(getText(R.string.h_help_text)) 
        .setCancelable(false) 
        .setNeutralButton("OK", new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int id) { 
          dismissDialog(DIALOG_HELP); 
         } 
        }); 
      AlertDialog helpAlert = helpBuilder.create(); 
      dialog = helpAlert; 
      break; 
     case DIALOG_ADD_MEASUREMENT: 
      AlertDialog.Builder addMeasurementBuilder; 
//   AlertDialog dialog; 

      Context mContext = getApplicationContext(); 
      LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(LAYOUT_INFLATER_SERVICE); 
      View layout = inflater.inflate(R.layout.add_measurement_dialog, (ViewGroup) findViewById(R.id.add_measurement_dialog)); 
      addMeasurementBuilder = new AlertDialog.Builder(mContext); 
      addMeasurementBuilder.setView(layout); 
      dialog = addMeasurementBuilder.create(); 
      break; 
     default: 
      dialog = null; 
     } 
     return dialog; 
    } 

    public void showHelpScreenDialog(View v) { 
     showDialog(DIALOG_HELP); 
    } 

    public void showNotYetImplementedToast(View v) { 
     Toast not_yet_implemented_toast = Toast.makeText(getApplicationContext(), getText(R.string.feature_not_implemented), Toast.LENGTH_SHORT); 
     not_yet_implemented_toast.show(); 
    } 

    public void showAddMeasurementDialog(View v) { 
     showDialog(DIALOG_ADD_MEASUREMENT); 
    } 
} 
+0

是否有可能共享BikeCalcMainMenu.java的代码?因为目前共享的代码不是什么导致错误 – doNotCheckMyBlog 2011-06-05 23:39:56

+0

完成...谢谢你看看。我看不出其他人会怎么帮忙,但我也看不出是什么原因导致这支部队开始了。 – autophage 2011-06-06 01:15:06

回答

0

您是否尝试删除XML中的onClick属性?

有可能是一个问题,当它试图约束他们,因为他们不存在

(也,你正在使用的应用程序上下文什么特别的原因?)

+0

我正在使用应用程序上下文,因为我是新手,而且是复制和粘贴的。有什么我应该使用? 我尝试删除onClick属性,并得到了我发布的响应zienkikk的相同错误...与上面发布的错误相同,直到最后,最终的“由...引发”是“WindowManagerBadTokenException:无法添加窗口 - 标记null不适用于应用程序”。 – autophage 2011-06-05 23:48:45

+1

每个活动也是一个上下文。所以你可以使用“this”。不幸的是,我不知道错误... – 2011-06-06 17:00:25

0

我没有测试过这但我相信这条线导致你的问题

View layout = inflater.inflate(R.layout.add_measurement_dialog, (ViewGroup) findViewById(R.id.add_measurement_dialog)); 

如果你提供第二个参数来充气,那么你实际上得到的父组返回。考虑只在这里传入null。

赋予http://developer.android.com/reference/android/view/LayoutInflater.html#inflate%28int,%20android.view.ViewGroup%29的细节

+0

不完全...这给了我一个崩溃,看起来在模拟器中是一样的,但有一个稍微不同的日志文件: '06-05 23:21:54.874:错误/ AndroidRuntime(209):引起:android.view.WindowManager $ BadTokenException:无法添加窗口 - 标记null不适用于应用程序 – autophage 2011-06-05 23:23:34

0

我刚刚撞我的头靠在一个或两个墙面上,同时解决了类似的问题。

尝试拨打电话addMeasurementBuilder = new AlertDialog.Builder(this);(而不是mContext),看看是否有效。

Android开发人员的对话框教程通过了getApplicationContext()的结果,但我测试了代码(复制和粘贴)并且它也崩溃了!非常糟糕的形式,谷歌。

我在this question找到了答案。

相关问题