使用onOptionsItemSelected从PreferenceArag和PreferenceFragments上升

Wil*_*ill 3 java android android-fragments

我在使用onOptionsItemSelectedAndroid Studio的默认"设置活动"(使用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
}
Run Code Online (Sandbox Code Playgroud)

这对片段非常有用 - onOptionsItemSelected @Overrides工作正常,返回SettingsActivity,但我想SettingsActivity在使用向上按钮时将控制返回到其父活动.

我已经阅读了文档,我明白了

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

这意味着我不能简单地为自己添加一个类似的@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>
Run Code Online (Sandbox Code Playgroud)

但这似乎根本没有做任何事情.

如果有的话,处理这个问题的好方法是什么?

mar*_*rco 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);
}
Run Code Online (Sandbox Code Playgroud)