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