デザイン ライブラリによって提供される新しいクラス: TabLayout を使用しています。そして、私が使用している特定のケースでは、もうタブを変更できないようにしたいと考えています。
ビューページャーでスワイプを無効にできましたが、タブをクリックしてページの変更を無効にする方法がわかりません。
前もって感謝します。
デザイン ライブラリによって提供される新しいクラス: TabLayout を使用しています。そして、私が使用している特定のケースでは、もうタブを変更できないようにしたいと考えています。
ビューページャーでスワイプを無効にできましたが、タブをクリックしてページの変更を無効にする方法がわかりません。
前もって感謝します。
私は同じ問題を抱えていたので、次のコードでタブのタッチイベントを無効にして解決しました:
LinearLayout tabStrip = ((LinearLayout)mTabLayout.getChildAt(0));
for(int i = 0; i < tabStrip.getChildCount(); i++) {
tabStrip.getChildAt(i).setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return true;
}
});
}
pat8719 の回答と非常に似ていますが、タブを無効にするだけで、タブが選択されないようにすることができます。
TabLayout tabLayout = (TabLayout) mParentView.findViewById(R.id.my_tabs);
TabLayoutUtils.enableTabs( tabLayout, false );
TabLayoutUtils クラス
public class TabLayoutUtils {
public static void enableTabs(TabLayout tabLayout, Boolean enable){
ViewGroup viewGroup = getTabViewGroup(tabLayout);
if (viewGroup != null)
for (int childIndex = 0; childIndex < viewGroup.getChildCount(); childIndex++)
{
View tabView = viewGroup.getChildAt(childIndex);
if ( tabView != null)
tabView.setEnabled(enable);
}
}
public static View getTabView(TabLayout tabLayout, int position){
View tabView = null;
ViewGroup viewGroup = getTabViewGroup(tabLayout);
if (viewGroup != null && viewGroup.getChildCount() > position)
tabView = viewGroup.getChildAt(position);
return tabView;
}
private static ViewGroup getTabViewGroup(TabLayout tabLayout){
ViewGroup viewGroup = null;
if (tabLayout != null && tabLayout.getChildCount() > 0 ) {
View view = tabLayout.getChildAt(0);
if (view != null && view instanceof ViewGroup)
viewGroup = (ViewGroup) view;
}
return viewGroup;
}
}
あなたが使用できる良いトリック:
次のように、クリックから保護したいビューをカバーするフレーム レイアウトを作成します。
<FrameLayout
android:clickable="true"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
このコードは、ビューの上に空/透明なビューを作成します。android:clickable="true" はクリックをインターセプトし、クリックがビューを通過するのを防ぎます!
このハックはおそらく最適化できますが、複数のビューを同時に保護するための数行のコードです!
タブのカスタム ビューを使用している場合、ViewGroups を調べたくない場合は、View#getParent() を使用してタブのビューへの参照を取得できます。
注: 親の代わりにカスタム ビュー自体を使用すると、余白ができ、ユーザーが空のスペースをクリックしてタブを変更できるため、機能しない場合があります。
View tabView = (View) tab.getCustomView().getParent();
tabView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return true;
}
});
//or
tabView.setEnabled(false);
OnTouchListener の方法と setEnabled() の方法は異なることを行いますが、効果は同じです。私はワンライナーの方が好きです。
繰り返しますが、これはカスタム ビューを使用する場合にのみ機能します。それ以外の場合、getParent() 呼び出しによって NullPointerException が発生します。
タブ間のスワイプを防止するための ViewPager と、タブが無効になっているときにタブをクリックすることを防止するための TabLayout の両方に対する包括的なソリューション。
最初に CustomViewPager および CustomTabLayout クラスを作成しました (ViewPager および TabLayout 基本クラスの機能を継承)
// content of CustomViewPager.java
package mypackage;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import androidx.viewpager.widget.ViewPager;
public class CustomViewPager extends ViewPager {
private boolean enableSwipe;
public CustomViewPager(Context context) {
super(context);
init();
}
public CustomViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
private void init() {
enableSwipe = true;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
return enableSwipe && super.onInterceptTouchEvent(event);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
return enableSwipe && super.onTouchEvent(event);
}
public void setEnableSwipe(boolean enableSwipe) {
this.enableSwipe = enableSwipe;
}
}
// content of CustomTabLayout.java
package mypackage;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import com.google.android.material.tabs.TabLayout;
public class CustomTabLayout extends TabLayout {
private boolean enableTabs;
public CustomTabLayout(Context context) {
super(context);
init();
}
public CustomTabLayout(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
private void init() {
enableTabs = true;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return !enableTabs;
}
public void setEnableTabs(boolean enable) {
this.enableTabs = enable;
}
}
UI を作成します。
<mypackage.CustomTabLayout
android:id="@+id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary" />
<mypackage.CustomViewPager
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="100dp"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
onCreate で、2 つのコントロール間の関係を作成します。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
CustomViewPager viewPager = findViewById(R.id.view_pager);
viewPager.setAdapter(sectionsPagerAdapter);
CustomTabLayout tabs = findViewById(R.id.tabs);
tabs.setupWithViewPager(viewPager);
}
タブを有効/無効にする EnableControls 関数:
private void EnableControls(boolean b) {
CustomViewPager viewPager = findViewById(R.id.view_pager);
CustomTabLayout tabs = findViewById(R.id.tabs);
viewPager.setEnableSwipe(b);
tabs.setEnableTabs(b);
}