Android TabHost:切换选项卡后,第一个加载的选项卡将保留在后台

Android TabHost:切换选项卡后,第一个加载的选项卡将保留在后台,android,listview,android-tabhost,Android,Listview,Android Tabhost,编辑: 当我使用TabLayout+ViewPager时也发生了同样的事情 我的一个片段有一个带有4个选项卡的TabHost。以下仅在黑暗主题处于活动状态时发生(AppCompatDelegate.MODE\u NIGHT\u YES) 当第一次显示片段时,我更改了选项卡,会出现重影效果,并且第一个选项卡保持在背景中: 无论哪个选项卡是默认选项卡,还是单击哪个选项卡之后,都不重要-任何组合都会导致以下情况: 当我退出片段并返回时,一切正常 这是组件树: 我将TabHost设置为:

编辑: 当我使用TabLayout+ViewPager时也发生了同样的事情


我的一个片段有一个带有4个选项卡的TabHost。以下仅在黑暗主题处于活动状态时发生(
AppCompatDelegate.MODE\u NIGHT\u 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);

这是什么原因造成的?如何解决?第一个加载的选项卡似乎保留在后台。

我发现了问题-打开片段时,我需要将.add()替换为.replace()


请参阅。

我不知道这是否是您的listview问题。但这是我的密码。我使用了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);
        }
    }
}
public类MainActivity扩展了AppCompatActivity{
专用工具栏;
私人摊位摊位;
私人视页机视页机;
@凌驾
受保护的void attachBaseContext(Context newBase){
super.attachBaseContext(CalligraphyContextWrapper.wrap(newBase));
}
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
CalligraphyConfig.initDefault(新的CalligraphyConfig.Builder()
.setDefaultFontPath(“fonts/ralway Regular.ttf”)
.setFontAttrId(R.attr.fontPath)
.build());
setContentView(R.layout.activity_sales);
toolbar=(toolbar)findviewbyd(R.id.toolbar);
设置支持操作栏(工具栏);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT\u输入\u状态\u始终\u隐藏);
viewPager=(viewPager)findViewById(R.id.viewPager);
设置viewPager(viewPager);
tabLayout=(tabLayout)findViewById(R.id.tabs);
tabLayout.setupWithViewPager(viewPager);
}
专用无效设置ViewPager(ViewPager ViewPager){
MainActivity.ViewPagerAdapter适配器=新的MainActivity.ViewPagerAdapter(getSupportFragmentManager());
addFragment(新的ListFragment(),“List”);
addFragment(newNewListFragment(),“new”);
viewPager.setAdapter(适配器);
}
类ViewPagerAdapter扩展了FragmentPagerAdapter{
私有最终列表MFFragmentList=new ArrayList();
私有最终列表MFFragmentTitleList=new ArrayList();
公共视图页面编辑器(碎片管理器){
高级经理;
}
@凌驾
公共片段getItem(int位置){
返回MFFragmentList.get(位置);
}
@凌驾
public int getCount(){
返回MFFragmentList.size();
}
public void addFragment(片段片段,字符串标题){
添加(片段);
MFFragmentTitleList.add(标题);
}
@凌驾
公共字符序列getPageTitle(int位置){
返回MFFragmentTitleList.get(位置);
}
}
}

尝试将白色或任何其他颜色设置为片段的根视图的
android:background
属性。 例如:


这里
RelativeLayout
是我的片段的根视图


这会解决你的问题。

是的。。。我也面临这个问题

您必须尝试添加需要充气(替换)的布局,而不是添加。 如果添加,则在滑动布局时将另一布局添加到当前布局。 只需替换布局

 FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        ft.replace(R.id.main, onlinesong_home); //this line
        ft.commit();

快乐编码

在设置ListView的地方张贴完整的代码。我不认为ListView是导致此问题的原因,请查看更新问题。我可以说这是您的ListView问题。我想确认您是否犯了与我所想的相同的错误。@PrimožKralj您是在使用viewpager还是其他东西来显示碎片。添加相关代码?请查看更新的问题。谢谢这就是问题所在!谢谢
 FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        ft.replace(R.id.main, onlinesong_home); //this line
        ft.commit();