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

Android-back按钮倾向于退出,而不是先前设置的片段?,android,android-layout,android-fragments,android-preferences,Android,Android Layout,Android Fragments,Android Preferences,在我的主要活动中,我有一个简单的占位符片段 通过选项菜单(actionbar),我想用用户设置首选项片段替换该片段。在这种特殊情况下,这是一种很好的方法 所有这些都可以正常工作,但用户设置片段中的“后退”按钮将退出应用程序。我想回到原始片段。为什么 public class MainActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) {

在我的主要活动中,我有一个简单的占位符片段

通过选项菜单(actionbar),我想用用户设置首选项片段替换该片段。在这种特殊情况下,这是一种很好的方法

所有这些都可以正常工作,但用户设置片段中的“后退”按钮将退出应用程序。我想回到原始片段。为什么

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" />

其他两个答案都不正确。你没有将碎片添加到后台;因此,backback不会检索backpressed上的片段

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

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

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

问题是
getFragmentManager
getSupportFragmentManager
返回不同的内容。在一个调用中,您使用本机fragmentManager,而在另一个调用中使用support one。你不能两者同时使用

将两者都更改为支持,使其工作正常:

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:这意味着您正在调用的两个片段都应该使用扩展支持片段来将片段添加到后台堆栈中,将您的片段事务更改为以下内容:

getSupportFragmentManager().beginTransaction().add(R.id.container, new UserSettingsFragment()).addToBackStack(null).commit();
您希望使用
.add()
而不是
.replace()
的原因是,使用add时,您的片段被添加到堆栈中,而使用replace时,所有其他片段被删除,然后添加您的片段。这就是为什么当你使用replace时,后退按钮会退出应用程序,因为你的应用程序没有任何其他片段可以导航回去

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