android - Duolingo 的 RTL ViewPager 覆盖 TabLayout 字体

标签 android android-viewpager

我正在使用以下代码将 TabLayout 的选项卡设置为自定义字体:

Locale locale = Locale.getDefault();
if (locale.equals(new Locale("ar"))) {
    for (int i = 0; i < tabs.getTabCount(); i++) {
        @SuppressLint("InflateParams") TextView tv = (TextView)LayoutInflater.from(this).inflate(R.layout.custom_tabview,null);
        tv.setTypeface(Typeface.createFromAsset(getAssets(),"fonts/JannaLT-Regular.ttf"));
        Objects.requireNonNull(tabs.getTabAt(i)).setCustomView(tv);
    }
}

在我用 RtlViewPager 库替换 XML 中的 ViewPager 之前,这一切正常,因为出于某种原因,谷歌仍然没有修复 RTL 布局中笨拙的错误滑动。

<com.duolingo.open.rtlviewpager.RtlViewPager
    android:id="@+id/viewpager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

之前:

<androidx.viewpager.widget.ViewPager
    android:id="@+id/viewpager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

字体不想改变。通过调试,我可以看出 if 语句仍在执行,for 循环及其内部的所有内容也在执行。但它就是没有改变。出于某种原因,简单地将它从 ViewPager 更改为 RtlViewPager 会导致 TabLayout 拒绝任何布局更改。即使尝试将文本颜色设置为红色也不起作用。

最佳答案

我认为这是因为 RTLviewpager 使用原始适配器的包装器,然后当适配器连接到 ViewPager 时它通知数据集更改了两次。

因此,简单的方法是将自定义数据观察器附加到 ViewPager 适配器,在自定义 TabLayout 内,每当数据更改时,再次应用自定义字体。

public class MyTabLayout extends TabLayout {


    @Nullable
    private PagerAdapter mPagerAdapter;

    private final DataSetObserver mDataSetObserver = new DataSetObserver() {
        @Override
        public void onChanged() {
            super.onChanged();
            notifyDataSetChanged();
        }
    };

    private final Runnable changeFontRunnable = () -> {
        /* ------ APPLY YOUR FONT HERE TO TAB LAYOUT  --------- */
    };

    public MyTabLayout(Context context) {
        super(context);
    }

    public MyTabLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public MyTabLayout(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }


    @Override
    public void setupWithViewPager(@Nullable ViewPager viewPager) {
        super.setupWithViewPager(viewPager);

        if (viewPager != null && viewPager.getAdapter() != null) {
            unregisterObserver();
            mPagerAdapter = viewPager.getAdapter();
            registerObserver();
        }
    }

    @Override
    protected void onDetachedFromWindow() {
        super.onDetachedFromWindow();
        unregisterObserver();
    }

    @Override
    protected void onAttachedToWindow() {
        super.onAttachedToWindow();
        unregisterObserver();
        registerObserver();
    }

    private void registerObserver() {
        if (mPagerAdapter != null) {
            mPagerAdapter.registerDataSetObserver(mDataSetObserver);
        }
    }

    private void unregisterObserver() {
        if (mPagerAdapter != null) {
            try {
                // may throw exception when the observer is not registered before
                mPagerAdapter.unregisterDataSetObserver(mDataSetObserver);
            } catch (IllegalStateException ignored) {}
        }
    }

    public void notifyDataSetChanged() {
        post(changeFontRunnable);
    }
}

关于android - Duolingo 的 RTL ViewPager 覆盖 TabLayout 字体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57677974/

相关文章:

android - mediaRecorder 记录最后 X 秒

android - ScrollView 隐藏底部线性布局

android - 在 ListView 中查看寻呼机?

android - 退出过渡不适用于 fragment 中 ViewPager 中的 ImageView 共享元素

Androidx ViewPager 不适用于 ScrollView 行为

android - System.out resolveUri 在错误的位图 uri : https://. 上失败 .. 当我尝试将图片从 Web 插入到 ListView 时

java - 未输入 ViewHolder 中的 OnClickListener

android - 禁用 ScrollView 中包含的 ListView 的滚动

android - Android 是否支持 3 层或更多层的嵌套 fragment ?

android - 从 XML 布局扩展 ViewPager