标题栏中的后退导航 - 片段

Back navigation in title bar - fragment

有很多这样的问题,但我尝试过的一切似乎都不起作用。 本质上,我有一个 main activity,它根据用户点击的内容调用不同的片段,而主片段是默认的。 我想在标题栏上有一个后退按钮,以返回到上一个片段。

我的片段是从主 activity 调用的,如下所示:

    Fragment fragment = null;
    fragment = new nextFragment();

    if (fragment != null) {
        FragmentManager fragmentManager = getFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

        fragmentTransaction.replace(R.id.frame_container, fragment).addToBackStack(null);
        fragmentTransaction.commit();
        fragmentTransaction.addToBackStack(null);

    } else {
        // error in creating fragment
        Log.e("MainActivity", "Error in creating fragment");
    }

但由于 ActionBarActivity activity 已弃用,我需要扩展 AppCompatActivity 而不是 FragmentActivity,这样我就可以使用 actionbar(我假设这就是我需要的)。 但是,我无法切换到我的片段。那么有谁知道我如何在我的片段中实现后退按钮或如何在这种情况下使用 AppCompatActivity。 感谢您的帮助。

您已保存调用

使用的最后一个片段

addToBacktack(null).commit()

因此调用它的下一步是在托管片段的 activity 中覆盖 onBackPressed()

@Override
public void onBackPressed() {
    if (getFragmentManager().getBackStackEntryCount() > 0 ){
        getFragmentManager().popBackStack();
    }
    else {
        super.onBackPressed();
    }
}

因此,每当您从片段中调用 activity 的 onBackPressed() 时,片段将回到上次保存的片段。

要在标题栏中添加后退按钮,您必须将以下代码添加到您的片段中。

 Toolbar toolbar = (Toolbar)view.findViewById(R.id.app_bar);
 AppCompatActivity AppCompatActivity = (AppCompatActivity)getActivity();
 AppCompatActivity.setSupportActionBar(toolbar);
 AppCompatActivity.getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    return view;
}

不要忘记将您的 MainActivity 扩展到 AppCompatActivity。

然后您必须在我的片段 class 中使用此 Java 代码来响应用户点击操作栏中的 back/up 图标。

@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
    case android.R.id.home:            
        getActivity().onBackPressed();
        return true;
    default:
        return super.onOptionsItemSelected(item);
}
} 

如果扩展AppCompatActivity请试试这个:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //Include these 2 lines ONLY if need to use Toolbar from layout xml as Action Bar
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        //Add back navigation in the title bar
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        //
        //Other works to be done in onCreate.....
        //
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (item.getItemId() == android.R.id.home) {
            //Title bar back press triggers onBackPressed()
            onBackPressed();
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    //Both navigation bar back press and title bar back press will trigger this method
    @Override
    public void onBackPressed() {
        if (getFragmentManager().getBackStackEntryCount() > 0 ) { 
            getFragmentManager().popBackStack(); 
        } 
        else { 
            super.onBackPressed(); 
        }
    }
}