Android 如何修复除非应用程序进入并从后台返回,否则片段事务不显示视图?

Android 如何修复除非应用程序进入并从后台返回,否则片段事务不显示视图?,android,android-fragments,fragmentmanager,Android,Android Fragments,Fragmentmanager,当前,我试图在单击RecyclerView项时在现有片段的顶部添加一个新片段。行为与预期不符。如下面的视频所示。片段事务在第一次尝试时起作用,但一旦我离开片段并通过底部栏返回或滚动到触发分页的列表底部,事务将不再使所需片段在单击项目时可见 但是,如果我使用设备菜单按钮并将应用程序带回前台,正确的片段加载将可见 另一个奇怪的行为是,一旦事务似乎不再工作,如果我使用底部栏切换选项卡,所有片段都将替换为空白屏幕。这也可以通过使用设备菜单按钮的上述方法解决 activity.xml <?xml v

当前,我试图在单击RecyclerView项时在现有片段的顶部添加一个新片段。行为与预期不符。如下面的视频所示。片段事务在第一次尝试时起作用,但一旦我离开片段并通过底部栏返回或滚动到触发分页的列表底部,事务将不再使所需片段在单击项目时可见

但是,如果我使用设备菜单按钮并将应用程序带回前台,正确的片段加载将可见

另一个奇怪的行为是,一旦事务似乎不再工作,如果我使用底部栏切换选项卡,所有片段都将替换为空白屏幕。这也可以通过使用设备菜单按钮的上述方法解决

activity.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

<FrameLayout
    android:id="@+id/view_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_above="@+id/bottomBar" />

<com.roughike.bottombar.BottomBar
    android:id="@+id/bottomBar"
    android:layout_width="match_parent"
    android:layout_height="60dp"
    android:layout_alignParentBottom="true"
    app:bb_tabXmlResource="@xml/bottombar_tabs"
    app:bb_activeTabColor="@color/blue"
    app:bb_titleTextAppearance="@style/BottomBarText"/>
</RelativeLayout>
addFragments和setBottomBarTabSelectListener都是在活动的onCreate中调用的

void addFragments () {
    mFragmentTransaction = 
getSupportFragmentManager().beginTransaction();
    mFragmentTransaction.add(R.id.view_container, mSettingsFragment, 
mSettingsFragment.getTag());
    mFragmentTransaction.add(R.id.view_container, mFeedFragment, 
mFeedFragment.getTag());
    mFragmentTransaction.add(R.id.view_container, mCalendarFragment, 
mCalendarFragment.getTag());
    mFragmentTransaction.add(R.id.view_container, mJobsFragment, 
mJobsFragment.getTag());
    mFragmentTransaction.commit();
}

public void setBottomBarTabSelectListener(){
    mBottomBar.setOnTabSelectListener(new OnTabSelectListener() {
        @Override
        public void onTabSelected(@IdRes int tabId) {

            Fragment selectedFragment = null;
            mFragmentTransaction = getSupportFragmentManager().beginTransaction();

            if(tabId == R.id.tab_jobs){
                selectedFragment = mJobsFragment;
            }
            else if(tabId == R.id.tab_calendar){
                selectedFragment = mCalendarFragment;
            }
            else if(tabId == R.id.tab_feed){
                selectedFragment = mFeedFragment;
            }
            else if(tabId == R.id.tab_settings){
                selectedFragment = mSettingsFragment;
            }

            mFragmentTransaction.replace(R.id.view_container, selectedFragment);
            mFragmentTransaction.commit();
        }
    });
}
单击列表项时会调用此函数

public void openJobDetails(){
    FragmentTransaction fragmentTransaction = getChildFragmentManager().beginTransaction();
    fragmentTransaction.add(R.id.view_container ,JobDetailFragment.newInstance());
    fragmentTransaction.addToBackStack(null);
    fragmentTransaction.commit();
}

我已经测试了项目点击,他们的功能正常。因此,我丢失的片段和事务肯定有一些东西

我遇到了一个类似的问题,通过在onResume中重新添加片段修复了它

请尝试以下代码:

private jobDetailFragment = JobDetailFragment.newInstance();
public void openJobDetails(){ 
    FragmentTransaction fragmentTransaction = 
    getChildFragmentManager().beginTransaction(); 
    fragmentTransaction.executePendingTransactions();
    if(jobDetailFragment.isAdded()){
        fragmentTransaction.show(jobDetailFragment);
    } else {
        fragmentTransaction.add(R.id.view_container, jobDetailFragment);
    }
    fragmentTransaction.addToBackStack(null); 
    fragmentTransaction.commit(); 
} 
我认为最好只添加一次片段,然后使用hide/show切换片段,使用isAdded检查添加状态,我的意思是对于底部的四个选项卡。也许为jobDetail启动一个新的活动是更好的方法~


您应该采取措施避免活动状态丢失。请参见:

当您按back然后重新打开应用程序时,是否有类似的行为?这似乎解决了问题。我对底部栏片段使用了隐藏/显示,并为JobDetail创建了一个父活动。
 protected void onResume() {
        super.onResume();
        Log.d(tag,"onResume");
        addFragments ();
     }
private jobDetailFragment = JobDetailFragment.newInstance();
public void openJobDetails(){ 
    FragmentTransaction fragmentTransaction = 
    getChildFragmentManager().beginTransaction(); 
    fragmentTransaction.executePendingTransactions();
    if(jobDetailFragment.isAdded()){
        fragmentTransaction.show(jobDetailFragment);
    } else {
        fragmentTransaction.add(R.id.view_container, jobDetailFragment);
    }
    fragmentTransaction.addToBackStack(null); 
    fragmentTransaction.commit(); 
}