有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

更改语言后,java自定义tablayout为空

我知道这个问题可能很奇怪,但在按下拇指向下按钮之前请先听我说完

我有TabLayout两个带有自定义视图的选项卡,我做了所有正确的事情,直到我想在自定义选项卡视图被选中或未选中时更改它,基本上,我希望它使选中视图的alpha=1,而未选中视图的alpha=0.3f

我找到了一种方法,它运行得很好,但是只有当应用程序语言是英语时。。当我将其更改为RTL语言(如阿拉伯语)时,在获取自定义选项卡视图时,它会给我一个NullPointerException

代码(检查注释)

private void initTabs() {

    adapter = new TabsPagerAdapter(getFragmentManager());
    viewpager.setAdapter(adapter);
    tabs.setupWithViewPager(viewpager);

    for (int i = 0; i < tabs.getTabCount(); i++) {
        TabLayout.Tab tab = tabs.getTabAt(i);
        tab.setCustomView(adapter.getTabView(i));
    }

    adapter.SetOnSelectView(tabs, 0); // this makes the first tab as selected 

    tabs.addOnTabSelectedListener(new TabLayout.BaseOnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            int c = tab.getPosition();
            adapter.SetOnSelectView(tabs, c);
        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {
            int c = tab.getPosition();
            adapter.SetUnSelectView(tabs, c);
        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {

        }
    });

}



public class TabsPagerAdapter extends FragmentPagerAdapter {

    private String tabTitles[] = new String[]{getString(R.string.tab1), getString(R.string.tab2)};
    LinearLayout main;

    public TabsPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    public View getTabView(int position) {
        View v = LayoutInflater.from(getActivity()).inflate(R.layout.tab_custom, null);
        main = v.findViewById(R.id.main_view);
        TextView title_tv = v.findViewById(R.id.tab_title_tv);
        TextView services_tv = v.findViewById(R.id.services_num);
        TextView products_tv = v.findViewById(R.id.products_num);
        title_tv.setText(tabTitles[position]);
        services_tv.setText("3 " + getString(R.string.services));
        products_tv.setText("4 " + getString(R.string.products));

        return v;
    }

    public void SetOnSelectView(TabLayout tabLayout, int position) {

        try {
            TabLayout.Tab tab = tabLayout.getTabAt(position);
            // NPE here due getCustomView == null only when locale == ar 
            View selected = tab.getCustomView();
            LinearLayout main = selected.findViewById(R.id.main_view);
            main.setAlpha(1);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    public void SetUnSelectView(TabLayout tabLayout, int position) {
        try {
            TabLayout.Tab tab = tabLayout.getTabAt(position);
            View selected = tab.getCustomView();
            LinearLayout main = selected.findViewById(R.id.main_view);
            main.setAlpha(0.3f);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    @Override
    public Fragment getItem(int i) {
        return new TabDeatilsFragment();
    }

    @Override
    public int getCount() {
        return tabTitles.length;
    }
}

Logcat

java.lang.NullPointerException: Attempt to invoke virtual method '安卓.view.View 安卓.view.View.findViewById(int)' on a null object reference
    at com._Fragment$TabsPagerAdapter.SetOnSelectView(_Fragment.java:156)
    at com._Fragment$1.onTabSelected(OrderDetails_Fragment.java:88)
    at 安卓.support.design.widget.TabLayout.dispatchTabSelected(TabLayout.java:1608)
    at 安卓.support.design.widget.TabLayout.selectTab(TabLayout.java:1601)
    at 安卓.support.design.widget.TabLayout.selectTab(TabLayout.java:1569)
    at 安卓.support.design.widget.TabLayout.populateFromPagerAdapter(TabLayout.java:1330)
    at 安卓.support.design.widget.TabLayout$PagerAdapterObserver.onChanged(TabLayout.java:2850)
    at 安卓.database.DataSetObservable.notifyChanged(DataSetObservable.java:37)
    at 安卓.support.v4.view.PagerAdapter.notifyDataSetChanged(PagerAdapter.java:294)
    at com.duolingo.open.rtlviewpager.DelegatingPagerAdapter.notifyDataSetChanged(DelegatingPagerAdapter.java:106)
    at com.duolingo.open.rtlviewpager.RtlViewPager.onRtlPropertiesChanged(RtlViewPager.java:67)

共 (1) 个答案

  1. # 1 楼答案

    我也有同样的问题,只是解决了

    问题是,当调用notifyDataSetChanged时,所有以前的CustomView都已重置

    您需要检查SetOnSelectView()中的自定义视图是否为空,并在notifyDataSetChanged之后重新分配自定义视图

    希望这有帮助