TabHost:切换标签后第一个加载的标签停留在后台
TabHost: first loaded tab stays in background after switching tabs
编辑:
当我使用 TabLayout+ViewPager 时发生了同样的事情。
我的一个片段有一个带有 4 个选项卡的 TabHost。以下仅在深色主题处于活动状态 (AppCompatDelegate.MODE_NIGHT_YES
) 时发生。
当片段第一次显示并且我更改标签时,出现幻影效果并且第一个标签停留在背景中:
哪个选项卡是默认选项卡以及之后单击哪个选项卡都没有关系 - 任何组合都会导致:
当我退出片段再回来时,就可以了。
这是组件树:
我这样设置 TabHost:
TabHost host = view.findViewById(R.id.tabHost);
host.setup();
TabHost.TabSpec spec = host.newTabSpec("one");
spec.setContent(R.id.tab1);
spec.setIndicator("", getResources().getDrawable(R.drawable.outline_info_white_24));
host.addTab(spec);
//Tab 2
spec = host.newTabSpec("two");
spec.setContent(R.id.tab2);
spec.setIndicator("", getResources().getDrawable(R.drawable.outline_account_balance_white_24));
host.addTab(spec);
//Tab 3
spec = host.newTabSpec("three");
spec.setContent(R.id.tab3);
spec.setIndicator("", getResources().getDrawable(R.drawable.outline_notifications_none_white_24));
host.addTab(spec);
//Tab 4
spec = host.newTabSpec("four");
spec.setContent(R.id.tab4);
spec.setIndicator("", getResources().getDrawable(R.drawable.outline_public_white_24));
host.addTab(spec);
这是什么原因造成的,如何解决?似乎第一个加载的标签留在后台。
我发现了问题 - 我需要在打开片段时用 .replace() 替换 .add()。
见this answer。
我不知道这是不是你的列表视图问题。但这是我的代码。我使用了 add(),它对我有用。
public class MainActivity extends AppCompatActivity {
private Toolbar toolbar;
private TabLayout tabLayout;
private ViewPager viewPager;
@Override
protected void attachBaseContext(Context newBase) {
super.attachBaseContext(CalligraphyContextWrapper.wrap(newBase));
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
CalligraphyConfig.initDefault(new CalligraphyConfig.Builder()
.setDefaultFontPath("fonts/Raleway-Regular.ttf")
.setFontAttrId(R.attr.fontPath)
.build());
setContentView(R.layout.activity_sales);
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
viewPager = (ViewPager) findViewById(R.id.viewpager);
setupViewPager(viewPager);
tabLayout = (TabLayout) findViewById(R.id.tabs);
tabLayout.setupWithViewPager(viewPager);
}
private void setupViewPager(ViewPager viewPager) {
MainActivity.ViewPagerAdapter adapter = new MainActivity.ViewPagerAdapter(getSupportFragmentManager());
adapter.addFragment(new ListFragment(), "List");
adapter.addFragment(new NewListFragment(), "New");
viewPager.setAdapter(adapter);
}
class ViewPagerAdapter extends FragmentPagerAdapter {
private final List<Fragment> mFragmentList = new ArrayList<>();
private final List<String> mFragmentTitleList = new ArrayList<>();
public ViewPagerAdapter(FragmentManager manager) {
super(manager);
}
@Override
public Fragment getItem(int position) {
return mFragmentList.get(position);
}
@Override
public int getCount() {
return mFragmentList.size();
}
public void addFragment(Fragment fragment, String title) {
mFragmentList.add(fragment);
mFragmentTitleList.add(title);
}
@Override
public CharSequence getPageTitle(int position) {
return mFragmentTitleList.get(position);
}
}
}
尝试将白色或任何其他颜色设置为片段根视图的 android:background
属性。
例如:
<?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"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorBlue">
<!--Rest of the layout-->
</RelativeLayout>
这里 RelativeLayout
是我片段的根视图。
这应该可以解决您的问题。
是的...我也面临这个问题。
您必须尝试添加您需要膨胀(替换)布局而不是添加的布局。
如果你添加然后当你滑动布局添加到另一个布局到当前布局。
只需替换布局。
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.main, onlinesong_home); //this line
ft.commit();
编码愉快!!!
编辑: 当我使用 TabLayout+ViewPager 时发生了同样的事情。
我的一个片段有一个带有 4 个选项卡的 TabHost。以下仅在深色主题处于活动状态 (AppCompatDelegate.MODE_NIGHT_YES
) 时发生。
当片段第一次显示并且我更改标签时,出现幻影效果并且第一个标签停留在背景中:
哪个选项卡是默认选项卡以及之后单击哪个选项卡都没有关系 - 任何组合都会导致:
当我退出片段再回来时,就可以了。
这是组件树:
我这样设置 TabHost:
TabHost host = view.findViewById(R.id.tabHost);
host.setup();
TabHost.TabSpec spec = host.newTabSpec("one");
spec.setContent(R.id.tab1);
spec.setIndicator("", getResources().getDrawable(R.drawable.outline_info_white_24));
host.addTab(spec);
//Tab 2
spec = host.newTabSpec("two");
spec.setContent(R.id.tab2);
spec.setIndicator("", getResources().getDrawable(R.drawable.outline_account_balance_white_24));
host.addTab(spec);
//Tab 3
spec = host.newTabSpec("three");
spec.setContent(R.id.tab3);
spec.setIndicator("", getResources().getDrawable(R.drawable.outline_notifications_none_white_24));
host.addTab(spec);
//Tab 4
spec = host.newTabSpec("four");
spec.setContent(R.id.tab4);
spec.setIndicator("", getResources().getDrawable(R.drawable.outline_public_white_24));
host.addTab(spec);
这是什么原因造成的,如何解决?似乎第一个加载的标签留在后台。
我发现了问题 - 我需要在打开片段时用 .replace() 替换 .add()。
见this answer。
我不知道这是不是你的列表视图问题。但这是我的代码。我使用了 add(),它对我有用。
public class MainActivity extends AppCompatActivity {
private Toolbar toolbar;
private TabLayout tabLayout;
private ViewPager viewPager;
@Override
protected void attachBaseContext(Context newBase) {
super.attachBaseContext(CalligraphyContextWrapper.wrap(newBase));
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
CalligraphyConfig.initDefault(new CalligraphyConfig.Builder()
.setDefaultFontPath("fonts/Raleway-Regular.ttf")
.setFontAttrId(R.attr.fontPath)
.build());
setContentView(R.layout.activity_sales);
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
viewPager = (ViewPager) findViewById(R.id.viewpager);
setupViewPager(viewPager);
tabLayout = (TabLayout) findViewById(R.id.tabs);
tabLayout.setupWithViewPager(viewPager);
}
private void setupViewPager(ViewPager viewPager) {
MainActivity.ViewPagerAdapter adapter = new MainActivity.ViewPagerAdapter(getSupportFragmentManager());
adapter.addFragment(new ListFragment(), "List");
adapter.addFragment(new NewListFragment(), "New");
viewPager.setAdapter(adapter);
}
class ViewPagerAdapter extends FragmentPagerAdapter {
private final List<Fragment> mFragmentList = new ArrayList<>();
private final List<String> mFragmentTitleList = new ArrayList<>();
public ViewPagerAdapter(FragmentManager manager) {
super(manager);
}
@Override
public Fragment getItem(int position) {
return mFragmentList.get(position);
}
@Override
public int getCount() {
return mFragmentList.size();
}
public void addFragment(Fragment fragment, String title) {
mFragmentList.add(fragment);
mFragmentTitleList.add(title);
}
@Override
public CharSequence getPageTitle(int position) {
return mFragmentTitleList.get(position);
}
}
}
尝试将白色或任何其他颜色设置为片段根视图的 android:background
属性。
例如:
<?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"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorBlue">
<!--Rest of the layout-->
</RelativeLayout>
这里 RelativeLayout
是我片段的根视图。
这应该可以解决您的问题。
是的...我也面临这个问题。
您必须尝试添加您需要膨胀(替换)布局而不是添加的布局。 如果你添加然后当你滑动布局添加到另一个布局到当前布局。 只需替换布局。
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.main, onlinesong_home); //this line
ft.commit();
编码愉快!!!