web-dev-qa-db-ja.com

TabLayoutでタブを無効にする

アプリで最新のデザインサポートライブラリのTabLayoutを使用しました。タブは、各タブのフラグメントをロードするビューページャーに接続されています。ビューページャーがユーザーが選択したタブのフラグメントをロードするまで、すべてのタブを無効にしたい。タブレイアウトを無効にしたり、クリックできないようにすることはできません。 setEnabled(false)setClickable(false)を使用しましたが、機能していません。 setVisiblity(View.GONE)を使用して非表示にすることはできますが、タブを常に表示したいのですが。

    tabLayout = (TabLayout) findViewById(R.id.tabLayout);
    tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
    tabLayout.setTabMode(TabLayout.MODE_FIXED);
    tabLayout.addTab(tabLayout.newTab().setIcon(R.drawable.near_me_hover).setTag(1));
    tabLayout.addTab(tabLayout.newTab().setIcon(R.drawable.all_hostels).setTag(2));
    tabLayout.addTab(tabLayout.newTab().setIcon(R.drawable.top_five).setTag(3));
    tabLayout.addTab(tabLayout.newTab().setIcon(R.drawable.advanced_search).setTag(4));
    tabLayout.setEnabled(false);
    tabLayout.setClickable(false);

[〜#〜] xml [〜#〜]

Android.support.design.widget.TabLayout
Android:id = "@ + id/tabLayout" Android:layout_width = "match_parent"
Android:layout_height = "0dp"
Android:layout_weight = "0.15"
Android:scrollbars = "horizo​​ntal"
Android:splitMotionEvents = "false">

        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            switch (tab.getPosition()) {
                case 0:
                    viewPager.setCurrentItem(tab.getPosition());
                    tab.setIcon(R.drawable.near_me_hover);
                    break;
                case 1:
                    viewPager.setCurrentItem(tab.getPosition());
                    tab.setIcon(R.drawable.all_hostels_hover);
                    break;
                case 2:
                    viewPager.setCurrentItem(tab.getPosition());
                    tab.setIcon(R.drawable.top_five_hover);
                    break;
                case 3:
                    viewPager.setCurrentItem(tab.getPosition());
                    tab.setIcon(R.drawable.advanced_search_hover);
                    break;
            }
        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {
            switch (tab.getPosition()) {
                case 0:
                    tab.setIcon(R.drawable.near_me);
                    break;
                case 1:
                    tab.setIcon(R.drawable.all_hostels);
                    break;
                case 2:
                    tab.setIcon(R.drawable.top_five);
                    break;
                case 3:
                    tab.setIcon(R.drawable.advanced_search);

                    break;
            }

        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {
        }
    });
    viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        }

        @Override
        public void onPageSelected(int position) {
            tabLayout.getTabAt(position).select();
        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    });
7

タブクリックリスナーによって実装される3つのメソッドがあり、そのうちの1つはonTabSelected()は、フラグメントが初期化されているかどうかを確認するためにブール条件を設定しますです。次に、その条件が満たされた場合は、トランザクションの実行を許可します。また、フラグメントコードの後に​​タブを初期化します

0
Aniruddha KM

別のトリック:

要件が満たされるまで、タブレイアウトに別の空白の透明なビューを配置できます。タブを有効/表示する必要がある場合は、空白のビューを非表示にします。

3
viv

タブを無効にしたい場合は、customViewを使用する必要があります

まず、カスタムレイアウトを作成します(例としてtextView)

v_tabview.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:Android="http://schemas.Android.com/apk/res/Android"
  Android:id="@+id/tabItemView"
  Android:layout_width="match_parent"
  Android:layout_height="wrap_content"
  Android:gravity="center"
  Android:maxLines="1"
  Android:textColor="@drawable/selector_tab" />

状態の有効化/無効化(色の変更)を変更するためのセレクターを作成します

セレクタータブ.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
  <item Android:color="#9e9e9e" Android:state_enabled="false" /> //gray
  <item Android:color="#64b246" Android:state_enabled="true" /> //green
</selector>

次に、それを膨らませ、名前を設定し、tabLayoutに追加します

arrayStringNames.forEach { name ->
    val textView: TextView = inflater.inflate(R.layout.v_tabview, tabLayout, false) as TextView
    textView.text = name
    val tab = tabLayout.newTab()
    tab.customView = textView
    tabLayout.addTab(tab)
}

そして最後に、手品!そのサンプルコードでは、すべてのタブを無効にしています。 2番目と3番目のタブを無効にする必要がある場合は、サイクルで「インデックス」をチェックし、必要に応じて無効にします

 for (index in 0 until tabLayout.tabCount) {
   ((tabLayout.getTabAt(index)?.customView) as? TextView)?.let { textView ->
     textView.isEnabled = enable //boolean
     (textView.parent as View).enable(enable)
  }
}
0
gbixahue

位置で特定のタブを有効にするには:

LinearLayout tabStrip = ((LinearLayout)tabLayout.getChildAt(0));     
tabStrip.getChildAt(position).setOnTouchListener((v,event)->false);

位置でタブを無効にするには:

 tabStrip.getChildAt(position).setOnTouchListener((v,event)->true);
0
Minion

util関数を作成できます。Kotlinでの私の楽しみです。

fun disalbeTabAt(tablayout: TabLayout?, index: Int) {
  (tablayout?.getChildAt(0) as? ViewGroup)?.getChildAt(0)?.isEnabled = false
}

ビューで何かをしたいときは、デバッグするか、親ビューをクリックして、ビューがどのように作成されているかを知ることができます。これにより、やりたいことが何でもできます。この場合、Tablayoutクラスに移動して理解することができます。

0