【问题标题】:Back Button is Unresponsive after Receiving Object from Other Activity从其他活动接收对象后后退按钮无响应
【发布时间】:2015-09-02 18:29:07
【问题描述】:

假设我的第一个活动有以下代码:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // Check which request we're responding to
    if (requestCode == SET_PLAN_REQUEST) {
        // Make sure the request was successful
        if (resultCode == RESULT_OK) {
            fixedPlan = data.getParcelableExtra("fixedPlan");
            recreate();
        }
    }
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_crop_rotation_planner);
    // Hide the action bar; I don't want to see that hideous thing, yet.
    getSupportActionBar().hide();
    // Initialize imageLoader
    MainActivity.imageLoader = new ImageLoader(getApplicationContext());
    restore(savedInstanceState);
}

private void restore(Bundle savedInstanceState) {
    // Check if activity has been launched previously
    if (savedInstanceState != null) {
        // Get saved crop rotation plan
        fixedPlan = savedInstanceState.getParcelable("fixedPlan");
        // Enable or disable btnViewPlan
        checkIfEnoughCropFamilies();
        // Set number of crop families
        setNumberOfCropFamilies();
        // get mSoilTypesList
        mSoilTypesList = (ArrayList<String>) savedInstanceState.getStringArrayList("mSoilTypesList");
        selectedTypeOfSoil = savedInstanceState.getString("selectedTypeOfSoil");
        mPlantList = savedInstanceState.getParcelableArrayList("mPlantList");

        // if mSoilTypesList hasn't been acquired, then execute loadSoilTypesFromNet to fetch data
        if (mSoilTypesList == null) {
            loadSoilTypesFromNet.execute();
        }
        // else if mSoilTypesList already exists, just display the soil types
        else {
            // only display if user hasn't selected soil yet
            if (selectedTypeOfSoil == null) {
                displaySoilTypes();
            }
            // if user has already selected soil type, then display plants
            else {
                getPlants();
            }
        }
    }
    else {
        loadSoilTypesFromNet.execute();
    }
}

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    savedInstanceState.putStringArrayList("mSoilTypesList", mSoilTypesList);
    savedInstanceState.putParcelableArrayList("mPlantList", mPlantList);
    savedInstanceState.putString("selectedTypeOfSoil", selectedTypeOfSoil);
    savedInstanceState.putParcelable("fixedPlan", fixedPlan);
}

@Override
protected void onDestroy() {
    dismissAlertDialog();
    dismissProgressDialog();
    loadPlantsFromNet.cancel(true);
    loadSoilTypesFromNet.cancel(true);
    super.onDestroy();
}

@Override
public void onBackPressed() {
    if (!fixedPlan.isEmpty()) {
        AlertDialog.Builder builder = new AlertDialog.Builder(CropRotationPlannerActivity.this);
        builder.setTitle(R.string.str_dbox_exit_crp_title);
        builder.setMessage(R.string.str_dbox_exit_crp_message);
        builder.setPositiveButton(R.string.str_dbox_exit_crp_ok, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                finish();
                CropRotationPlannerActivity.super.onBackPressed();
            }
        });
        builder.setNegativeButton(R.string.str_dbox_exit_crp_cancel, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
            }
        });
        alert = builder.create();
        alert.setCanceledOnTouchOutside(false);
        alert.setCancelable(false);
        alert.show();
    }
    else
        super.onBackPressed();
}

而我正在进行的活动有以下重要代码:

    // We'll be sending our fixedPlan back to previous activity (CropRotationPlannerActivity)
@Override
public void onBackPressed() {
    // TODO :: THINK OF THE SAVE FEATURE
    final Intent intent = new Intent();
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle(R.string.str_dbox_exit_title);
    builder.setMessage(R.string.str_dbox_exit_message);
    builder.setPositiveButton(R.string.str_dbox_exit_yes, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            intent.putExtra("fixedPlan", fixedPlan);
            setResult(RESULT_OK, intent);
            // TODO : Somewhat buggy code here?
            // TODO : Takes quite sometime to process :/
            finish();
            PlanActivity.super.onBackPressed();
        }
    });
    builder.setNegativeButton(R.string.str_dbox_exit_no, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            setResult(RESULT_CANCELED, intent);
            dialog.dismiss();
            finish();
            PlanActivity.super.onBackPressed();
        }
    });
    builder.setNeutralButton(R.string.str_dbox_exit_cancel, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            dialog.dismiss();
        }
    });
    builder.setCancelable(false); // so as to prevent the back button from closing the dialog box
    alert = builder.create();
    alert.setCanceledOnTouchOutside(false); // prevents user from canceling dialog box by clicking outside
    alert.show();
}

当用户退出第一个活动并且对象fixedPlan 没有任何内容时,我希望用户退出到主菜单。当它没有任何内容时,我想弹出一个DialogBox,以便用户知道当前活动包含重要信息,并再次询问用户是否真的想退出。

要进入下一个活动,fixedPlan 不应为空。从那个活动中走出来,fixedPlan 也永远不会是空的。但是为什么一旦用户回到上一个活动,后退按钮没有响应呢?我该怎么办?

请注意,这只发生在按下肯定按钮时(在第二个活动中)。另一件事是,一旦我在第二个活动上按下了肯定按钮,并且在我进入第一个活动的那一刻,然后我回到那里并按下否定按钮,后退按钮就会起作用。这确实是积极按钮的问题。顺便说一句,我可以感觉到按下后退按钮的振动。哈哈。只是。它没有响应。

添加finish() 也不起作用(添加到第一个活动的onBackPressed 方法中的else 语句)。

【问题讨论】:

  • 在第二个活动按下肯定按钮后,您的对话框是否显示在第一个活动中?
  • 它什么都不做?或者它会关闭你的活动?
  • 什么都没有。我只是感觉后退按钮因为声音而收到了我的点击,但它什么也没做。
  • recreate() 函数是什么?
  • 注意到了一个可能与此问题没有直接关系的错误:您应该在您的onSaveInstanceState() 中调用super.onSaveInsatanceState()

标签: java android navigation


【解决方案1】:

尝试在第二个活动内的正按钮单击事件中更改在finish() 之前添加dialog.dismiss()

另外,我认为您应该删除对PlanActivity.super.onBackPressed(); 的调用,无论是在正面还是负面按钮点击下。

【讨论】:

  • 感谢您的帮助,但这并没有解决我的问题。对不起,我现在只能回复;前段时间很忙。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-18
  • 1970-01-01
  • 2014-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多