使用onOptionsItemSelected从PreferenceArag和PreferenceFragments上升

时间:2015-11-05 09:14:03

标签: java android android-fragments

我在使用Android Studio的默认“设置活动”(onOptionsItemSelected)时使用extends AppCompatPreferenceActivity时遇到问题。活动的重要部分是:

public class SettingsActivity extends AppCompatPreferenceActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setupActionBar();
    }

    private void setupActionBar() {
        ActionBar actionBar = getSupportActionBar();
        if (actionBar != null) {
            // Show the Up button in the action bar.
            actionBar.setDisplayHomeAsUpEnabled(true);
        }
    }

    public static class GeneralPreferenceFragment extends PreferenceFragment {

        // [...]

        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            int id = item.getItemId();
            if (id == android.R.id.home) {
                startActivity(new Intent(getActivity(), SettingsActivity.class));
                return true;
            }
            return super.onOptionsItemSelected(item);
        }
    }

    // two more fragments
}

这适用于片段 - onOptionsItemSelected @Override效果很好,返回SettingsActivity但我希望SettingsActivity将控制权返回给它使用向上按钮时的父活动。

我已阅读the documentation,我理解

  

虽然您的片段会为其添加的每个菜单项收到一个项目选择的回调,但当用户选择菜单项时,活动首先会收到相应的回调。

这意味着我不能简单地将类似的@Override(使用不同的Intent)添加到SettingsActivity本身来处理我想要的情况,以免碎片返回到父级而不是活动。

我尝试通过AndroidManifest.xml处理此问题:

<activity
    android:name=".SettingsActivity"
    android:label="@string/title_activity_settings"
    android:parentActivityName=".BlahBlahActivity" >
    <meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value="com.example.appthing.BlahBlahActivity" />
</activity>

但这似乎没有做任何事情。

处理这个问题有什么好办法?

2 个答案:

答案 0 :(得分:6)

在Android Studio创建的模板中,onOptionsItemSelected方法属于片段。

我通过评论它们并为重写onBackPressed的活动编写onOptionsItemSelected方法来解决

@Override
public void onBackPressed() {
    super.onBackPressed();
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    if (id == android.R.id.home) {
        onBackPressed();
        return true;
    }
    return super.onOptionsItemSelected(item);
}

答案 1 :(得分:1)

在网上搜索了几个小时之后,我想出了一个粗略的(但略带hackish)解决方案。

我在SettingsActivity添加了一个字段:private boolean inFragment;

在片段'onCreate()方法中,我添加了

((SettingsActivity) getActivity()).inFragment = true;

最后,我在@Override中使用了SettingsActivity

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    if (id == android.R.id.home) {
        if (!inFragment) {
            Intent upIntent = NavUtils.getParentActivityIntent(this);
            NavUtils.navigateUpTo(this, upIntent);
            return true;
        }
        return false;
    }
    return super.onOptionsItemSelected(item);
}

这对我的目的有用,但我觉得可能(或者应该)有更好的方法。