1

I want to exit my app with an my customized alert dialog showing first to ask if user is sure they want to exit. am getting an error with the code I have below. By the way I used getparent() since the activity is within an activity group:

    @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();


            }

    }

Here is the error in 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)

EDIT: Here is the whole code for 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();


            }

    }
4

2 回答 2

1

替换这一行

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
        }
    });

}
于 2012-10-01T04:25:05.040 回答
0

一旦您发现了 RecipeList.java 中的错误,请尝试使用 ALertDialog 框,如下所示:

 new AlertDialog.Builder(this)
    .setIcon(android.R.drawable.ic_dialog_alert)
    .setTitle("Quit")
    .setMessage("Do you really want to quit?")
    .setPositiveButton("Yes", new DialogInterface.OnClickListener() {

        @Override
        public void onClick(DialogInterface dialog,int which){
                       //your code for positive button click

            }
                    })
    .setNegativeButton("No", new OnClickListener(){
        @Override
        public void onClick(DialogInterface dialog, int which){
             //your code for negative button click



        }

    })
    .show();
于 2012-10-01T04:23:05.500 回答