当前位置: 首页 > 知识库问答 >
问题:

片段addToBackStack行为

杜俊爽
2023-03-14

我在Android中面临两个关于碎片的问题。

我有一个应用程序与一个导航抽屉片段在我的主要活动。当我在这个导航抽屉上单击一个项目时,一个新的片段会加载到主活动中的“fragment_placeholder”上。很简单。

创建MainActivity时,我将在fragment_placeholder中加载“homeFragment”。这个片段有一个带有两个标签的SlidingTabLayout,每个标签加载相应的片段。这个家庭片段是我的应用程序的“主要”部分。

public class MainActivity extends ActionBarActivity {

private Toolbar mToolbar;

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

    // Loading home fragment
    if (findViewById(R.id.fragment_placeholder) != null) {

        if (savedInstanceState != null) {
            return;
        }
        FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
        HomeFragment homeFragment = new HomeFragment();
        homeFragment.setArguments(getIntent().getExtras());

        fragmentTransaction.replace(R.id.fragment_placeholder, homeFragment);
        fragmentTransaction.addToBackStack(null); // This is not working properly
        fragmentTransaction.commit();
    }
}
 @Override
public void itemClicked(View view, int position) {

    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

    switch(position)
    {
        // Home
        case 0:
            HomeFragment homeFragment = new HomeFragment();
            fragmentTransaction.replace(R.id.fragment_placeholder, homeFragment);
            break;

        // My account
        case 1:
            MyAccountFragment myAccountFragment = new MyAccountFragment();
            fragmentTransaction.replace(R.id.fragment_placeholder, myAccountFragment);
            break;

        // Config
        case 2:
            ConfigFragment configFragment = new ConfigFragment();
            fragmentTransaction.replace(R.id.fragment_placeholder, configFragment );
            break;

    }

    fragmentTransaction.commit();
    mDrawerLayout.closeDrawer(mDrawerListView);


}

共有1个答案

华善
2023-03-14

我根据以下答案找到了一个解决方案https://stackoverflow.com/a/14588642/1959257

我将代码更改为:

public void onBackPressed() {
    HomeFragment homeFragment = new HomeFragment();
    displayFragment(homeFragment);
}

 private void displayFragment(Fragment pFragment) {

   // Fragment currently inside the placeholder view
   Fragment fr = (Fragment) getSupportFragmentManager()
            .findFragmentById(R.id.fragment_placeholder);

   // If this fragment is a HomeFragment, close app
   if (fr instanceof HomeFragment) {
        finish();
   }
   else {
        // Replace curretly Fragment by HomeFragment
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        ft.replace(R.id.fragment_placeholder, pFragment);
        ft.commit();
   }
}
 类似资料:
  • 我有一个带有三个Fragments的,让我们称它们为A、B和C。A在活动中调用。 并在按下某些按钮时被替换为片段B或C,并且FragmentTransaction调用。 但是,假设我连续三次调用片段B,我如何防止它自己堆积到它身上呢?同时我希望这是可能的:B呼叫

  • 我正在创建片段转换器助手类,对此我有一些问题。 我称之为碎片转换器 它有一个fragmentContainer,它是一个视图组,包含我想展示的所有片段。 我已经做了自己的替换(片段片段更改,布尔需要保存到堆栈) 功能是: 从碎片容器中移除旧碎片 错误如下: 如果我使用我的替换功能并保存以使其正常工作,我可以使用设备的后退按钮后退并返回到先前添加的片段,它就像一个符咒。 但是,当我想替换一个片段而不

  • 你好, 我有MainActivity,TitlesFragment和DelessFragment。 我的MainActivity将显示TitlesFragment,当用户单击标题时,TitlesFragment将被DetailsFragment替换。那很好。然而,当我将DetailsFragment添加到addToBackStack时。当我点击后退按钮时,它会关闭应用程序,而不是显示标题碎片。 我

  • 这是负责将片段添加到后堆栈的函数: 当我点击后退按钮时,最后一个片段没有被加载(什么也没有发生)。 知道是什么导致的吗? 编辑:FragmentManager日志。 http://pastebin.com/mYnVdkLG 在我看来,我的应用程序似乎在两次保存第二个视图,而不是先保存第一个视图,然后再保存第二个视图。

  • 问题内容: 我试图动态地向片段中的表添加行。但是,我遇到了一些运行时错误,非常需要一些建议。 Logcat: 1) 2) 3) 片段二 MainActivity.java fragment_two.xml 问题答案: 改变这个 至 这是避免的一个错误。 并用于初始化视图。要知道为什么要读 何时调用活动上下文或应用程序上下文?

  • 我有一个,它创建一个,然后这个创建另一个: 这让我想到。是否真的可以删除并转到? 提前感谢您的时间,我在网上找不到任何合适的信息!