android - 使用自定义警报对话框 onbackpressed 时出错

标签 android back android-alertdialog

我想退出我的应用程序,首先显示一个自定义的警告对话框,询问用户是否确定要退出。我在下面的代码中遇到错误。顺便说一下,我使用 getparent() 因为 Activity 在 Activity 组中:

    @Override
    public void onBackPressed() {
        LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
        View view = inflater.inflate(R.layout.grocerylistdelete, null);
        AlertDialog.Builder builder = new AlertDialog.Builder(getParent());
        builder.setView(view);

        Button yes = (Button) view.findViewById(R.id.buttonYes);
        yes.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                Intent i = new Intent(Intent.ACTION_MAIN);
                i.addCategory(Intent.CATEGORY_HOME);
                i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(i);
                finish();    

            }
        });

        Button no = (Button) view.findViewById(R.id.buttonNo);
        no.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                Intent i = new Intent(getApplicationContext(), RecipeList.class);
                finish();
                startActivity(i);


            }
        });

        AlertDialog alert = builder.create();
        alert.show();


            }

    }

这是 LogCat 中的错误:

10-01 11:45:39.795: E/AndroidRuntime(1549): FATAL EXCEPTION: main
10-01 11:45:39.795: E/AndroidRuntime(1549): java.lang.NullPointerException
10-01 11:45:39.795: E/AndroidRuntime(1549):     at com.mexican.recipes.RecipeList.onBackPressed(RecipeList.java:139)
10-01 11:45:39.795: E/AndroidRuntime(1549):     at   android.app.Activity.onKeyUp(Activity.java:1898)
10-01 11:45:39.795: E/AndroidRuntime(1549):     at android.view.KeyEvent.dispatch(KeyEvent.java:1280)
10-01 11:45:39.795: E/AndroidRuntime(1549):     at android.app.Activity.dispatchKeyEvent(Activity.java:2078)
10-01 11:45:39.795: E/AndroidRuntime(1549):     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1663)
10-01 11:45:39.795: E/AndroidRuntime(1549):     at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:789)
10-01 11:45:39.795: E/AndroidRuntime(1549):     at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:789)
10-01 11:45:39.795: E/AndroidRuntime(1549):     at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchKeyEvent(PhoneWindow.java:1687)
10-01 11:45:39.795: E/AndroidRuntime(1549):     at com.android.internal.policy.impl.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1120)
10-01 11:45:39.795: E/AndroidRuntime(1549):     at android.app.Activity.dispatchKeyEvent(Activity.java:2073)
10-01 11:45:39.795: E/AndroidRuntime(1549):     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1663)
10-01 11:45:39.795: E/AndroidRuntime(1549):     at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:789)
10-01 11:45:39.795: E/AndroidRuntime(1549):     at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:789)
10-01 11:45:39.795: E/AndroidRuntime(1549):     at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:789)
10-01 11:45:39.795: E/AndroidRuntime(1549):     at android.widget.TabHost.dispatchKeyEvent(TabHost.java:278)
10-01 11:45:39.795: E/AndroidRuntime(1549):     at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:789)
10-01 11:45:39.795: E/AndroidRuntime(1549):     at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:789)
10-01 11:45:39.795: E/AndroidRuntime(1549):     at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchKeyEvent(PhoneWindow.java:1687)
10-01 11:45:39.795: E/AndroidRuntime(1549):     at com.android.internal.policy.impl.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1120)
10-01 11:45:39.795: E/AndroidRuntime(1549):     at android.app.Activity.dispatchKeyEvent(Activity.java:2073)
10-01 11:45:39.795: E/AndroidRuntime(1549):     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1663)
10-01 11:45:39.795: E/AndroidRuntime(1549):     at android.view.ViewRoot.deliverKeyEventToViewHierarchy(ViewRoot.java:2560)
10-01 11:45:39.795: E/AndroidRuntime(1549):     at android.view.ViewRoot.handleFinishedEvent(ViewRoot.java:2535)
10-01 11:45:39.795: E/AndroidRuntime(1549):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1867)
10-01 11:45:39.795: E/AndroidRuntime(1549):     at android.os.Handler.dispatchMessage(Handler.java:99)
10-01 11:45:39.795: E/AndroidRuntime(1549):     at android.os.Looper.loop(Looper.java:123)
10-01 11:45:39.795: E/AndroidRuntime(1549):     at android.app.ActivityThread.main(ActivityThread.java:3683)
10-01 11:45:39.795: E/AndroidRuntime(1549):     at  java.lang.reflect.Method.invokeNative(Native Method)
10-01 11:45:39.795: E/AndroidRuntime(1549):     at  java.lang.reflect.Method.invoke(Method.java:507)
 10-01 11:45:39.795: E/AndroidRuntime(1549):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
10-01 11:45:39.795: E/AndroidRuntime(1549):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
10-01 11:45:39.795: E/AndroidRuntime(1549):     at dalvik.system.NativeStart.main(Native Method)

编辑: 以下是 RecipeList.java 的完整代码:

public class RecipeList extends ListActivity{
Typeface font;
Typeface bold;

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

    font = Typeface.createFromAsset(RecipeList.this.getAssets(), "Book Antiqua.ttf");

    TextView recipe = (TextView) findViewById(R.id.textViewrecipe);

    recipe.setTypeface(font, Typeface.BOLD);
        setListAdapter(new MyAdapter(RecipeList.this, android.R.layout.simple_list_item_1,R.id.textViewCategory,getResources().getStringArray(R.array.categories)));
        this.getListView().setCacheColorHint(0);



}
private class MyAdapter extends ArrayAdapter<String> {

    public MyAdapter(Context context, int resource, int textViewResourceId,
            String[] strings) {
        super(context, resource, textViewResourceId, strings);
    }

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View row = inflater.inflate(R.layout.recipelistrow, parent, false);
    String [] items = getResources().getStringArray(R.array.categories);


    ImageView iv = (ImageView) row.findViewById(R.id.imageViewRecipe);
    TextView tvCategory = (TextView) row.findViewById(R.id.textViewCategory);
    TextView tvCategoryDesc = (TextView) row.findViewById(R.id.textViewcategorydesc);

    tvCategory.setTypeface(font, Typeface.BOLD);
    tvCategory.setText(items[position]);

    if(items[position].equals("Burritos")){
        iv.setImageResource(R.drawable.ic_list_burritos);
        tvCategoryDesc.setText("Burritos, with tasty combination of beef and beans, make it an enticing dish for your family and friends");
    }if(items[position].equals("Tacos")){
        iv.setImageResource(R.drawable.ic_list_tacos);
        tvCategoryDesc.setText("Taco counts a favorite for its versatility and variety. It's perfect for meat lovers and veggie lovers too!");
    }if(items[position].equals("Enchiladas")){
        iv.setImageResource(R.drawable.ic_list_enchiladas);
        tvCategoryDesc.setText("Enchilada makes the perfect match for your favorite salsa. Make it a bit spicy. It's awesome!");
    }if(items[position].equals("Fajitas")){
        iv.setImageResource(R.drawable.ic_list_fajitas);
        tvCategoryDesc.setText("Fajita is well-loved for its exquisite and delightful filling. It's a choice of either beef or boneless chicken.");
    }if(items[position].equals("Quesadillas")){
        iv.setImageResource(R.drawable.ic_list_quesadillas);
        tvCategoryDesc.setText("Quesadillas are filled with oozing goodness and mouthwatering flavors that you will find it hard to resist.");
    }if(items[position].equals("Salads")){
        iv.setImageResource(R.drawable.ic_list_salads);
        tvCategoryDesc.setText("Eat healthy and feel healthy with your protein-rich salads. Cut-off your carbs with this Mexican dish.");
    }if(items[position].equals("Chilis")){
        iv.setImageResource(R.drawable.ic_list_chili);
        tvCategoryDesc.setText("Make an extraordinary appetizer out of your chili con carne and enjoy its tempting flavors.");
    }if(items[position].equals("Other Delicacies")){
        iv.setImageResource(R.drawable.ic_list_otherdelicacies);
        tvCategoryDesc.setText("Learn more about the Mexican recipes that are sinfully good!");
    }
    return row;

    }
}
    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);
        Intent i = new Intent(this, SubRecipeList.class);
        i.putExtra("id", id);


        View view = TabGroupActivity.group.getLocalActivityManager()
                .startActivity("show_city", i
                .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP))
                .getDecorView();


                TabGroupActivity.group.replaceView(view);



    }

    public void grocerylist (View v){
        Intent intent = new Intent(RecipeList.this, GroceryList.class);
        startActivity(intent);
    }
    public void recipe (View v){

        Intent i = new Intent(RecipeList.this, RecipeList.class);
        startActivity(i);
    }
    public void more (View v){

        Intent i = new Intent(RecipeList.this, MoreApps.class);
        startActivity(i);
    }


    @Override
    public void onBackPressed() {
        LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
        View view = inflater.inflate(R.layout.grocerylistdelete, null);
        AlertDialog.Builder builder = new AlertDialog.Builder(getParent());
        builder.setView(view);

        Button yes = (Button) view.findViewById(R.id.buttonYes);
        yes.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                Intent i = new Intent(Intent.ACTION_MAIN);
                i.addCategory(Intent.CATEGORY_HOME);
                i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(i);
                finish();    

            }
        });

        Button no = (Button) view.findViewById(R.id.buttonNo);
        no.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                Intent i = new Intent(getApplicationContext(), RecipeList.class);
                finish();
                startActivity(i);


            }
        });

        AlertDialog alert = builder.create();
        alert.show();


            }

    }

最佳答案

替换这一行

AlertDialog.Builder builder = new AlertDialog.Builder(getParent());

AlertDialog.Builder builder = new AlertDialog.Builder(yourActivityName.this);

以这种方式使用对话框很难知道问题..

public void showDialog() {

    final Dialog dialog = new Dialog(yourActivityName.this);
    dialog.setContentView(R.layout.grocerylistdelete);
    dialog.setTitle("Save the changes?");

    dialog.show();
    Button yes = (Button) dialog.findViewById(R.id.buttonYes);
    yes.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            //Do youur work
        }
    });
    Button no = (Button) dialog.findViewById(R.id.buttonNo);
    no.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            //Do your work
        }
    });

}

关于android - 使用自定义警报对话框 onbackpressed 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12667262/

相关文章:

android - Phonegap 3 (apache cordova) getpicture 错误(无法读取属性 'PictureSourceType' 和 DATA_URL

android - ClassCastException : android. support.v7.widget.LinearLayoutCompat$LayoutParams 无法转换为 android.widget.LinearLayout$LayoutParams

android - 在 Instagram 提要中分享 Intent 问题

android - 确认返回提示退出应用

angularjs - 在注销 Angular.js 时删除模板缓存

Android:点击后退按钮两次?

Android 如何在点击后禁用正面按钮

java - AlertDialog 再次打开

android - Android 系统从未发送 WAP_PUSH_DELIVER Intent

android - 实现多深度 ExpandableList Android