2011-06-05 32 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找到了答案。