片段事务在替换中无法正常工作
fragment transaction not work properly in replace
我正在使用 Fragment 和 tabLayout。
有一个问题。 hystory
片段第一次显示,第二次不显示,其他次数。但是home
片段是正常工作的,随时显示。
TabLayout tabLayout;
FrameLayout frm_Content;
FragmentManager fragmentManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tabLayout = (TabLayout) findViewById(R.id.tab_layout);
frm_Content = (FrameLayout) findViewById(R.id.frm_content);
final HomeFragment homeFragment = new HomeFragment();
final HistoryFragment historyFragment =new HistoryFragment();
fragmentManager = getSupportFragmentManager();
if (savedInstanceState == null) {
fragmentManager.beginTransaction()
.add(R.id.frm_content, homeFragment)
.commit();
}
tabLayout.addTab(tabLayout.newTab().setText("home"),0);
tabLayout.addTab(tabLayout.newTab().setText("hystory"),1);
tabLayout.addTab(tabLayout.newTab().setText("region"),2);
tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
switch(tab.getPosition()){
case 0 :
// fragmentManager.beginTransaction().hide(historyFragment);
fragmentManager.beginTransaction().replace(R.id.frm_content, homeFragment)
.commit();
.break();
case 1:
fragmentManager.beginTransaction().replace(R.id.frm_content, historyFragment)
.commit();
.break();
case 2 :
}
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
}
XML :
<LinearLayout 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"
android:background="@color/md_blue_grey_50"
android:orientation="vertical"
tools:context=".MainActivity">
<com.google.android.material.tabs.TabLayout
android:id="@+id/tab_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<FrameLayout
android:id="@+id/frm_content"
android:layout_width="match_parent"
android:layout_height="match_parent">
</FrameLayout>
试试这个:
final FragmentTransaction fTransaction = getFragmentManager().beginTransaction();
fTransaction.replace(R.id.frm_content, new NewFragment(), "NewFragmentTag");
fTransaction.commit();
好吧,你的问题可能是你忘了把 break
放在盒子里。
在 OnCreate 中,您将 homeFragment 视图作为您看到的第一个视图。然后从 0 索引单击选项卡,您打开 homeFragment 但您错过了 break
-> 在 homeFragment 之后,historyFragment 被打开。
当您单击 historyFragment(第 1 个位置)时,您也错过了 break
,但对下一个(第 2 个位置)索引没有其他操作,因此片段不会更改。
你应该做的是把break
替换成碎片
switch(tab.getPosition()){
case 0 :
// fragmentManager.beginTransaction().hide(historyFragment);
fragmentManager.beginTransaction().replace(R.id.frm_content, homeFragment)
.commit();
break;
case 1:
fragmentManager.beginTransaction().replace(R.id.frm_content, historyFragment)
.commit();
break;
case 2 :
}
我正在使用 Fragment 和 tabLayout。
有一个问题。 hystory
片段第一次显示,第二次不显示,其他次数。但是home
片段是正常工作的,随时显示。
TabLayout tabLayout;
FrameLayout frm_Content;
FragmentManager fragmentManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tabLayout = (TabLayout) findViewById(R.id.tab_layout);
frm_Content = (FrameLayout) findViewById(R.id.frm_content);
final HomeFragment homeFragment = new HomeFragment();
final HistoryFragment historyFragment =new HistoryFragment();
fragmentManager = getSupportFragmentManager();
if (savedInstanceState == null) {
fragmentManager.beginTransaction()
.add(R.id.frm_content, homeFragment)
.commit();
}
tabLayout.addTab(tabLayout.newTab().setText("home"),0);
tabLayout.addTab(tabLayout.newTab().setText("hystory"),1);
tabLayout.addTab(tabLayout.newTab().setText("region"),2);
tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
switch(tab.getPosition()){
case 0 :
// fragmentManager.beginTransaction().hide(historyFragment);
fragmentManager.beginTransaction().replace(R.id.frm_content, homeFragment)
.commit();
.break();
case 1:
fragmentManager.beginTransaction().replace(R.id.frm_content, historyFragment)
.commit();
.break();
case 2 :
}
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
}
XML :
<LinearLayout 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"
android:background="@color/md_blue_grey_50"
android:orientation="vertical"
tools:context=".MainActivity">
<com.google.android.material.tabs.TabLayout
android:id="@+id/tab_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<FrameLayout
android:id="@+id/frm_content"
android:layout_width="match_parent"
android:layout_height="match_parent">
</FrameLayout>
试试这个:
final FragmentTransaction fTransaction = getFragmentManager().beginTransaction();
fTransaction.replace(R.id.frm_content, new NewFragment(), "NewFragmentTag");
fTransaction.commit();
好吧,你的问题可能是你忘了把 break
放在盒子里。
在 OnCreate 中,您将 homeFragment 视图作为您看到的第一个视图。然后从 0 索引单击选项卡,您打开 homeFragment 但您错过了 break
-> 在 homeFragment 之后,historyFragment 被打开。
当您单击 historyFragment(第 1 个位置)时,您也错过了 break
,但对下一个(第 2 个位置)索引没有其他操作,因此片段不会更改。
你应该做的是把break
替换成碎片
switch(tab.getPosition()){
case 0 :
// fragmentManager.beginTransaction().hide(historyFragment);
fragmentManager.beginTransaction().replace(R.id.frm_content, homeFragment)
.commit();
break;
case 1:
fragmentManager.beginTransaction().replace(R.id.frm_content, historyFragment)
.commit();
break;
case 2 :
}