2011-11-14 20 views
0

時,應用程序崩潰我有一個列表視圖,包含從數據庫中填充。我在每一行上放一個按鈕,當它被點擊時,它會顯示一個AlertDialog對話框。當AlertDialog約爲

我的項目沒有錯誤,但每次點擊AlertDialog框的按鈕時,應用程序都會崩潰。

這裏是我的代碼:

donate_now.setOnClickListener(new OnClickListener() { 
public void onClick(View view) { 
    AlertDialog.Builder alertbox = new AlertDialog.Builder(ProjectsList.this); 
    alertbox.setTitle("SMS"); 
    alertbox.setMessage (Html.fromHtml(("Ihr SMS wird vorbereitet. Bitte 
         bestätigen Sie mit 'Ok' und senden Sie danach die SMS ab! 
         <p><small>Sie helfen dem Projekt mit " +mPriceIndex + ". 
         Betrag je SMS zzgl. Transport. Der Betrag abzüglich 17 Cent 
         geht direkt an die Partner-Organisation.")));             
alertbox.setNeutralButton("Ok", new DialogInterface.OnClickListener() { 
public void onClick(DialogInterface arg0, int arg1) { 
    Intent sendIntent = new Intent(Intent.ACTION_VIEW); 
    sendIntent.putExtra("address", mShortcodeIndex); 
    sendIntent.putExtra("sms_body", mKeywordIndex); 
    sendIntent.setType("vnd.android-dir/mms-sms"); 
    startActivity(sendIntent); 
    } 
    }); 
    alertbox.show(); 

誰能幫我分析一下我出問題在哪裏?

這裏的調試:

11-14 10:38:37.834: E/AndroidRuntime(509): android.view.WindowManager$BadTokenException: Unable to add window -- token [email protected] is not valid; is your activity running? 
11-14 10:38:37.834: E/AndroidRuntime(509): at android.view.ViewRoot.setView(ViewRoot.java:468) 
11-14 10:38:37.834: E/AndroidRuntime(509): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177) 
11-14 10:38:37.834: E/AndroidRuntime(509): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91) 
11-14 10:38:37.834: E/AndroidRuntime(509): at android.view.Window$LocalWindowManager.addView(Window.java:424) 
11-14 10:38:37.834: E/AndroidRuntime(509): at android.app.Dialog.show(Dialog.java:239) 
11-14 10:38:37.834: E/AndroidRuntime(509): at android.app.AlertDialog$Builder.show(AlertDialog.java:802) 
11-14 10:38:37.834: E/AndroidRuntime(509): at spendino.de.ProjectsList$MySimpleCursorAdapter$2.onClick(ProjectsList.java:213) 
11-14 10:38:37.834: E/AndroidRuntime(509): at android.view.View.performClick(View.java:2364) 
11-14 10:38:37.834: E/AndroidRuntime(509): at android.view.View.onTouchEvent(View.java:4179) 
11-14 10:38:37.834: E/AndroidRuntime(509): at android.widget.TextView.onTouchEvent(TextView.java:6541) 
11-14 10:38:37.834: E/AndroidRuntime(509): at android.view.View.dispatchTouchEvent(View.java:3709) 
11-14 10:38:37.834: E/AndroidRuntime(509): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
11-14 10:38:37.834: E/AndroidRuntime(509): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
11-14 10:38:37.834: E/AndroidRuntime(509): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
11-14 10:38:37.834: E/AndroidRuntime(509): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
11-14 10:38:37.834: E/AndroidRuntime(509): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
11-14 10:38:37.834: E/AndroidRuntime(509): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
11-14 10:38:37.834: E/AndroidRuntime(509): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1659) 
11-14 10:38:37.834: E/AndroidRuntime(509): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107) 
11-14 10:38:37.834: E/AndroidRuntime(509): at android.app.Activity.dispatchTouchEvent(Activity.java:2061) 
11-14 10:38:37.834: E/AndroidRuntime(509): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1643) 
11-14 10:38:37.834: E/AndroidRuntime(509): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
11-14 10:38:37.834: E/AndroidRuntime(509): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
11-14 10:38:37.834: E/AndroidRuntime(509): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
11-14 10:38:37.834: E/AndroidRuntime(509): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
11-14 10:38:37.834: E/AndroidRuntime(509): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
11-14 10:38:37.834: E/AndroidRuntime(509): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
11-14 10:38:37.834: E/AndroidRuntime(509): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1659) 
11-14 10:38:37.834: E/AndroidRuntime(509): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107) 
11-14 10:38:37.834: E/AndroidRuntime(509): at android.app.Activity.dispatchTouchEvent(Activity.java:2061) 
11-14 10:38:37.834: E/AndroidRuntime(509): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1643) 
11-14 10:38:37.834: E/AndroidRuntime(509): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
11-14 10:38:37.834: E/AndroidRuntime(509): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
11-14 10:38:37.834: E/AndroidRuntime(509): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
11-14 10:38:37.834: E/AndroidRuntime(509): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
11-14 10:38:37.834: E/AndroidRuntime(509): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
11-14 10:38:37.834: E/AndroidRuntime(509): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
11-14 10:38:37.834: E/AndroidRuntime(509): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1659) 
11-14 10:38:37.834: E/AndroidRuntime(509): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107) 
11-14 10:38:37.834: E/AndroidRuntime(509): at android.app.Activity.dispatchTouchEvent(Activity.java:2061) 
11-14 10:38:37.834: E/AndroidRuntime(509): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1643) 
11-14 10:38:37.834: E/AndroidRuntime(509): at android.view.ViewRoot.handleMessage(ViewRoot.java:1691) 
11-14 10:38:37.834: E/AndroidRuntime(509): at android.os.Handler.dispatchMessage(Handler.java:99) 
11-14 10:38:37.834: E/AndroidRuntime(509): at android.os.Looper.loop(Looper.java:123) 
11-14 10:38:37.834: E/AndroidRuntime(509): at android.app.ActivityThread.main(ActivityThread.java:4363) 
11-14 10:38:37.834: E/AndroidRuntime(509): at java.lang.reflect.Method.invokeNative(Native Method) 
11-14 10:38:37.834: E/AndroidRuntime(509): at java.lang.reflect.Method.invoke(Method.java:521) 
11-14 10:38:37.834: E/AndroidRuntime(509): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
11-14 10:38:37.834: E/AndroidRuntime(509): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
11-14 10:38:37.834: E/AndroidRuntime(509): at dalvik.system.NativeStart.main(Native Method) 

下面是完整的活動代碼:

public class ProjectsList extends Activity implements OnItemClickListener{ 
    /** Called when the activity is first created. */ 

    ListView listView; 

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

     doSync(); 
     ListView listView = (ListView) findViewById(R.id.lstText); 
     listView.setOnItemClickListener(this); 
     listView.setAdapter(new MySimpleCursorAdapter(this, R.layout.listitems, 
       managedQuery(Uri.withAppendedPath(Provider.CONTENT_URI, 
         Database.Project.NAME), new String[] { BaseColumns._ID, 
         Database.Project.C_PROJECTTITLE, 
         Database.Project.C_SMALLIMAGE, Database.Project.C_PROJECTDESCRIPTION, Database.Project.C_ORGANIZATIONTITLE, Database.Project.C_DONATIONAMOUNT, Database.Project.C_KEYWORD, Database.Project.C_PRICE, Database.Project.C_SHORTCODE}, null, null, null), 
       new String[] { Database.Project.C_PROJECTTITLE, 
         Database.Project.C_SMALLIMAGE, Database.Project.C_PROJECTDESCRIPTION, Database.Project.C_ORGANIZATIONTITLE, Database.Project.C_DONATIONAMOUNT}, new int[] { 
         R.id.txt_title, R.id.image, R.id.txt_list_desc, R.id.txt_org, R.id.btn_amount})); 

    } 

    public void onItemClick(AdapterView<?> l, View v, int position, long id) { 
     Intent listIntent = new Intent(this, DetailsActivity.class); 
     listIntent.putExtra("spendino.de.ProjectDetail.position",position); 
     listIntent.setData(Uri.withAppendedPath(Uri.withAppendedPath(
       Provider.CONTENT_URI, Database.Project.NAME), Long 
       .toString(id))); 
     startActivity(listIntent); 

    } 

    /* 
    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
     case R.id.ui_menu_sync: 
      doSync(); 
      return true; 
     default: 
      return super.onOptionsItemSelected(item); 
     } 
    } 
*/ 
    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.menu, menu); 
     return true; 
    } 

    void doSync() { 
     Intent serviceIntent = new Intent(this, Sync.class); 
     startService(serviceIntent); 
    } 


    class MySimpleCursorAdapter extends SimpleCursorAdapter { 

     Context context=null; 
     ImageLoader loader = null; 
     private LayoutInflater mInflater = null; 
     private int mProjectNameIndex = -1; 
     private int mOrgNameIndex = -1; 
     private int mDescIndex = -1; 
     private int mDonationIndex = -1; 
     private int mSmallImageIndex = -1; 
     private int mKeywordIndex = -1; 
     private int mPriceIndex = -1; 
     private int mShortcodeIndex = -1; 



     public MySimpleCursorAdapter(Context context, int layout, Cursor c, 
       String[] from, int[] to) { 
      super(context, layout, c, from, to); 
      loader = new ImageLoader(context); 
      this.context = context; 

      mInflater = getLayoutInflater();  
      mProjectNameIndex = c.getColumnIndexOrThrow(Database.Project.C_PROJECTTITLE); 
      mOrgNameIndex = c.getColumnIndexOrThrow(Database.Project.C_ORGANIZATIONTITLE); 
      mDescIndex = c.getColumnIndexOrThrow(Database.Project.C_PROJECTDESCRIPTION); 
      mDonationIndex = c.getColumnIndexOrThrow(Database.Project.C_DONATIONAMOUNT); 
      mSmallImageIndex = c.getColumnIndexOrThrow(Database.Project.C_SMALLIMAGE); 
      mKeywordIndex = c.getColumnIndexOrThrow(Database.Project.C_KEYWORD); 
      mPriceIndex = c.getColumnIndexOrThrow(Database.Project.C_PRICE); 
      mShortcodeIndex = c.getColumnIndexOrThrow(Database.Project.C_SHORTCODE); 

     } 

     @Override 
     public View newView(Context context, Cursor cursor, ViewGroup parent) { 
      View convertView = mInflater.inflate(R.layout.listitems, null); 
      convertView.setClickable(true); 
      convertView.setFocusable(true); 
      convertView.setBackgroundResource(android.R.drawable.menuitem_background); 
      //convertView.setOnItemClickListener(ProjectsList.this); 

      convertView.setOnClickListener(new OnClickListener() { 
       public void onClick(View view) { 

        /* 
        Intent myIntent = new Intent(view.getContext(), DetailsActivity.class); 
        String position = null; 
       myIntent.putExtra("spendino.de.ProjectDetail.position",position); 
        long id = 0; 
       myIntent.setData(Uri.withAppendedPath(Uri.withAppendedPath(
          Provider.CONTENT_URI, Database.Project.NAME), Long 
          .toString(id))); 
        view.getContext().startActivity(myIntent); 
       } 
       });*/ 

      } 
        }); 




      return convertView; 
     } 

     protected void onItemClick(AdapterView<?> l, View v, int position, long id) { 
      Intent listIntent = new Intent(ProjectsList.this, DetailsActivity.class); 
      listIntent.putExtra("spendino.de.ProjectDetail.position",position); 
      listIntent.setData(Uri.withAppendedPath(Uri.withAppendedPath(
        Provider.CONTENT_URI, Database.Project.NAME), Long 
        .toString(id))); 
      startActivity(listIntent);} 

     @Override 
     public void bindView(View view, Context context, Cursor cursor) { 
      // Get your views from 'view' 
      TextView projectTextView = (TextView) view.findViewById(R.id.txt_title); 
      TextView orgTextView = (TextView) view.findViewById(R.id.txt_org); 
      TextView descTextView = (TextView) view.findViewById(R.id.txt_list_desc); 
      ImageView someImageView = (ImageView) view.findViewById(R.id.image); 
      Button donate_now = (Button) view.findViewById(R.id.btn_donate); 
      Button btn_amount = (Button) view.findViewById(R.id.btn_amount); 
      donate_now.setFocusable(true); 
      donate_now.setClickable(true); 
      // Set the data 
      projectTextView.setText(cursor.getString(mProjectNameIndex)); 
      orgTextView.setText("von " + cursor.getString(mOrgNameIndex)); 
      descTextView.setText(Html.fromHtml(cursor.getString(mDescIndex)+"...")); 
      btn_amount.setText("Summe Spende: " + cursor.getString(mDonationIndex)+" €"); 

      donate_now.setOnClickListener(new OnClickListener() { 
       public void onClick(View view) { 


        AlertDialog.Builder alertbox = new AlertDialog.Builder(view.getContext()); 
              alertbox.setTitle("SMS"); 
              alertbox.setMessage (Html.fromHtml(("Ihr SMS wird vorbereitet. Bitte bestätigen Sie mit 'Ok' und senden Sie danach die SMS ab! <p><small>Sie helfen dem Projekt mit " +mPriceIndex + ". Betrag je SMS zzgl. Transport. Der Betrag abzüglich 17 Cent geht direkt an die Partner-Organisation."))); 


              alertbox.setNeutralButton("Ok", new DialogInterface.OnClickListener() { 

               public void onClick(DialogInterface arg0, int arg1) { 
                Intent sendIntent = new Intent(Intent.ACTION_VIEW); 
                sendIntent.putExtra("address", mShortcodeIndex); 
                sendIntent.putExtra("sms_body", mKeywordIndex); 
                sendIntent.setType("vnd.android-dir/mms-sms"); 
                startActivity(sendIntent); 
               } 

            }); 
              alertbox.show(); 

      } 
        }); 
      loader.DisplayImage(cursor.getString(mSmallImageIndex), context, someImageView);  
     } 


     public void setViewImage(ImageView v, String value) { 
      v.setTag(value); 
      loader.DisplayImage(value, context, v); 
     } 
    } 


} 
+0

你可以把整個活動代碼。 Beco'z這段代碼可以正常工作,只需按一下按鈕即可。 – user370305

+0

是的,我剛更新了這個問題。請看看,謝謝 – hectichavana

回答

1

你需要給適當的上下文的alertDialog必須是當前活動context.So你需要爲活動聲明一個上下文。

//At the beginning of class where you declare the Listview 
ListView lv; 
Context ctx = this; 

並在你的方法。

donate_now.setOnClickListener(new OnClickListener() { 
      public void onClick(View view) { 


       AlertDialog.Builder alertbox = new AlertDialog.Builder(ctx); 
             alertbox.setTitle("SMS"); 
             alertbox.setMessage (Html.fromHtml(("Ihr SMS wird vorbereitet. Bitte bestätigen Sie mit 'Ok' und senden Sie danach die SMS ab! <p><small>Sie helfen dem Projekt mit " +mPriceIndex + ". Betrag je SMS zzgl. Transport. Der Betrag abzüglich 17 Cent geht direkt an die Partner-Organisation."))); 


             alertbox.setNeutralButton("Ok", new DialogInterface.OnClickListener() { 

              public void onClick(DialogInterface arg0, int arg1) { 
               Intent sendIntent = new Intent(Intent.ACTION_VIEW); 
               sendIntent.putExtra("address", mShortcodeIndex); 
               sendIntent.putExtra("sms_body", mKeywordIndex); 
               sendIntent.setType("vnd.android-dir/mms-sms"); 

               startActivity(sendIntent); 
              } 

           }); 
             alertbox.show(); 

     } 
       }); 
+0

不,ProjectList.class是活動本身不是一項新活動。你能幫我解碼嗎?我應該刪除/編輯什麼?謝謝 – hectichavana

+0

請檢查我的編輯。 –

+0

我得到這個錯誤味精:'令牌上的語法錯誤,而不是預期的InterfaceHeader'在DialogInterface.OnClickListener() – hectichavana

0

最簡單的解決方案是調用的getParent()代替ProjectsList.this。根據Documentation of getParent(),這似乎很好。

donate_now.setOnClickListener(new OnClickListener() { 
public void onClick(View view) { 
AlertDialog.Builder alertbox = new AlertDialog.Builder(getParent()); 
alertbox.setTitle("SMS"); 
alertbox.setMessage (Html.fromHtml(("Ihr SMS wird vorbereitet. Bitte 
        bestätigen Sie mit 'Ok' und senden Sie danach die SMS ab! 
        <p><small>Sie helfen dem Projekt mit " +mPriceIndex + ". 
        Betrag je SMS zzgl. Transport. Der Betrag abzüglich 17 Cent 
        geht direkt an die Partner-Organisation.")));             
alertbox.setNeutralButton("Ok", new DialogInterface.OnClickListener() { 
public void onClick(DialogInterface arg0, int arg1) { 
Intent sendIntent = new Intent(Intent.ACTION_VIEW); 
sendIntent.putExtra("address", mShortcodeIndex); 
sendIntent.putExtra("sms_body", mKeywordIndex); 
sendIntent.setType("vnd.android-dir/mms-sms"); 
startActivity(sendIntent); 
} 
}); 
alertbox.show(); 

我在我的代碼上測試了它(它大部分是相同的),它完美的工作!