MHo*_*gge 46 android disabled-control android-tablayout
我正在使用设计库提供的新类:TabLayout.我想在特定的情况下,我正在使用的那个不能再改变标签了.
我设法禁用其viewpager上的滑动,但我无法弄清楚如何通过单击选项卡禁用页面更改.
提前致谢.
Mic*_*ele 98
我有同样的问题,我解决了它使用以下代码禁用选项卡上的触摸事件:
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;
}
});
}
Run Code Online (Sandbox Code Playgroud)
pat*_*719 36
我发现了一个类似的答案,它更简单一点,如果你愿意,也可以让你在不必处理覆盖onTouch事件的情况下重新启用标签.
TabLayout tabLayout = (TabLayout) mParentView.findViewById(R.id.my_tabs);
LinearLayout tabStrip = ((LinearLayout)tabLayout.getChildAt(0));
tabStrip.setEnabled(false);
for(int i = 0; i < tabStrip.getChildCount(); i++) {
tabStrip.getChildAt(i).setClickable(false);
}
Run Code Online (Sandbox Code Playgroud)
如果要重新启用选项卡,只需将子元素的tabStrip.setEnabled和setClickable设置为true即可
LinearLayout tabStrip = ((LinearLayout)tabLayout.getChildAt(0));
tabStrip.setEnabled(true);
for(int i = 0; i < tabStrip.getChildCount(); i++) {
tabStrip.getChildAt(i).setClickable(true);
}
Run Code Online (Sandbox Code Playgroud)
gra*_*tnz 19
与pat8719的答案非常相似,但只是禁用选项卡就足以阻止它们被选中.
TabLayout tabLayout = (TabLayout) mParentView.findViewById(R.id.my_tabs);
TabLayoutUtils.enableTabs( tabLayout, false );
Run Code Online (Sandbox Code Playgroud)
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;
}
}
Run Code Online (Sandbox Code Playgroud)
Tob*_*iug 11
你可以使用的好方法:
创建一个框架布局,覆盖您要保护的视图,如下所示:
<FrameLayout
android:clickable="true"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
Run Code Online (Sandbox Code Playgroud)
此代码将在视图顶部创建并清空/透明视图.android:clickable ="true"将拦截点击并阻止点击进入视图!
这个hack可能会被优化,但它的几行代码可以同时保护多个视图!
对我来说,工作方法是这样的:
bool condition = ...
foreach (var view in _tabLayout.Touchables)
view.Clickable = condition;
Run Code Online (Sandbox Code Playgroud)
这是100%安全的,因为API 1支持getTouchables()调用.无需手动遍历布局或其他内容.我认为它比接受的答案简单得多,但只有当所有标签都必须标记为不可点击时.
PS:示例是在C#上,因为我正在使用Xamarin,但将它转换回Java非常容易.请享用!=)
科特林的例子:
tabLayout.touchables.forEach { it.isClickable = false }
Run Code Online (Sandbox Code Playgroud)
Java示例:
for (View v: tabLayout.getTouchables())
v.setClickable(false);
Run Code Online (Sandbox Code Playgroud)
如果您正在为选项卡使用自定义视图,并且您不想查看视图组,则可以使用 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);
Run Code Online (Sandbox Code Playgroud)
OnTouchListener 方式和 setEnabled() 方式做不同的事情,但具有相同的效果。我更喜欢单线。
同样,这仅在您使用自定义视图时才有效,否则 getParent() 调用将导致 NullPointerException。
| 归档时间: |
|
| 查看次数: |
25622 次 |
| 最近记录: |