Android - 后退按钮倾向于退出而不是先前设置的片段?

时间:2014-11-11 19:32:17

标签: android android-layout android-fragments android-preferences

在我的主要活动中,我有一个简单的PlaceHolder片段。

通过选项菜单(操作栏)我想用用户设置首选项片段替换该片段。在这种特定情况下,这是一个好方法。

一切正常,但用户设置片段中的“后退”按钮将退出App。我想回到最初的片段。怎么会?

public class MainActivity extends ActionBarActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView( R.layout.activity_main);
        if (savedInstanceState == null) {
            getSupportFragmentManager().beginTransaction()
                .replace( R.id.container, new PlaceholderFragment()).commit();
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
     getMenuInflater().inflate(R.menu.main, menu);
     return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
     int id = item.getItemId();
     if (id == R.id.action_settings) {
         getFragmentManager().beginTransaction()
            .replace( R.id.container, new UserSettingsFragment()).addToBackStack(null).commit();
         return true;
     }
    return super.onOptionsItemSelected(item);
}

主要布局文件是:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="nl.deholtmans.usersettings.MainActivity"
    tools:ignore="MergeRootFrame" />

UserSettings片段是:

public class UserSettingsFragment extends PreferenceFragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        View view = super.onCreateView(inflater, container, savedInstanceState);
        view.setBackgroundColor( Color.WHITE);
        addPreferencesFromResource( R.xml.preferences);
        return view; 
    }
}

3 个答案:

答案 0 :(得分:1)

其他两个答案都不正确。你没有将片段添加到backstack;因此,backstack将不会在onBackPressed上检索该片段。

对片段事务进行以下编辑:

.replace( R.id.container, new PlaceholderFragment()).commit();

.replace( R.id.container, new PlaceholderFragment()).addToBackStack("fragmentname").commit();

答案 1 :(得分:1)

问题是getFragmentManagergetSupportFragmentManager会返回不同的内容。在一个调用中,您使用的是本机fragmentManager,另一个是支持。你不能同时使用它们。

将两者都更改为可以正常工作的支持:

public class MainActivity extends ActionBarActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView( R.layout.activity_main);
        if (savedInstanceState == null) {
            getSupportFragmentManager().beginTransaction()
                .replace( R.id.container, new PlaceholderFragment()).commit();
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
     getMenuInflater().inflate(R.menu.main, menu);
     return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
     int id = item.getItemId();
     if (id == R.id.action_settings) {
         getSupportFragmentManager().beginTransaction()
            .replace( R.id.container, new UserSettingsFragment()).addToBackStack(null).commit();
         return true;
     }
    return super.onOptionsItemSelected(item);
}

ps:这意味着您正在调用的两个片段都应该使用扩展支持片段

答案 2 :(得分:0)

要将片段添加到后台堆栈,请将片段事务更改为以下内容:

getSupportFragmentManager().beginTransaction().add(R.id.container, new UserSettingsFragment()).addToBackStack(null).commit();

您希望使用.add()而不是.replace()的原因是因为添加您的片段会被添加到堆栈中但是替换所有其他片段会被删除然后添加您的片段。这就是退出按钮退出应用程序的原因,当您使用替换时,您的应用程序没有任何其他片段可以导航回来。