tabLayout当tab数目较多,一屏无法展示时,按键有时会没有反应,看打印信息也没有报错。看tabLayout的源码,知道tabLayout是一个横向的scrollView,猜测可能是滑动冲突。解决方法如下:

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@drawable/bg_apps_now_holo"android:orientation="vertical"tools:context=".MainActivity"><RelativeLayoutandroid:id="@+id/ll_net"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><com.hisense.movienow.widget.CustomTabLayoutandroid:id="@+id/tab"android:layout_gravity="center_horizontal"android:layout_centerHorizontal="true"android:layout_width="wrap_content"android:layout_height="144px"app:tabPaddingEnd="-1px"app:tabPaddingStart="-1px"app:tabMaxWidth="600px"app:tabMinWidth="80px"app:tabIndicatorColor="@color/tab_slelect_text"app:tabBackground="@null"app:tabGravity="center"android:nextFocusRight="@+id/tab"android:nextFocusLeft="@+id/tab"app:tabTextColor="@color/tab_normal_color"app:tabSelectedTextColor="@color/tab_slelect_text"app:tabRippleColor="@color/trans"app:tabUnboundedRipple="true"app:tabTextAppearance="@style/tabTextStyle"app:tabMode="scrollable"></com.hisense.movienow.widget.CustomTabLayout><Viewandroid:background="@color/lb_search_bar_text"android:layout_width="match_parent"android:layout_alignBottom="@+id/tab"android:layout_marginTop="-2px"android:layout_height="1px"/><android.support.v4.view.ViewPagerandroid:id="@+id/pager"android:layout_below="@+id/tab"android:layout_width="match_parent"android:layout_height="match_parent"></android.support.v4.view.ViewPager></RelativeLayout><LinearLayoutandroid:id="@+id/ll_noNet"android:visibility="gone"android:orientation="vertical"android:gravity="center"android:layout_width="match_parent"android:layout_height="match_parent"><ImageViewandroid:src="@drawable/ic_network"android:layout_width="300px"android:layout_height="300px" /><TextViewandroid:id="@+id/tv_tip"android:textSize="20sp"android:textColor="@color/title_color"android:layout_marginTop="30px"android:text="@string/no_net"android:layout_width="wrap_content"android:layout_height="wrap_content" /><TextViewandroid:id="@+id/btn_settingnet"android:text="@string/no_net_button"android:focusable="true"android:gravity="center"android:layout_marginTop="30px"android:shadowColor="#59000000"android:shadowDy="1"android:shadowRadius="1"android:textColor="@color/title_color"android:textSize="18sp"android:background="@drawable/detail_button_style"android:layout_width="400px"android:layout_height="100px" /></LinearLayout></LinearLayout>

MainActivity.java


import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewParent;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;import com.google.gson.Gson;
import com.hisense.movienow.bean.PatternBean;
import com.hisense.movienow.bean.TabItem;
import com.hisense.movienow.bean.TagBean;
import com.hisense.movienow.bean.TagName;
import com.hisense.movienow.utils.CommonUtils;
import com.hisense.movienow.utils.Constant;
import com.hisense.movienow.utils.SaveValue;
import com.hisense.movienow.widget.CustomRecycleView;
import com.hisense.movienow.widget.CustomTabLayout;import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;public class MainActivity extends AppCompatActivity {private final String TAG = "MainActivity";public CustomTabLayout tableLayout;public ViewPager pager;private List<TabItem> list = new ArrayList<>();private ArrayList<Fragment> fragments = new ArrayList<>();Context mContext;private PatternBean patternBean;private SaveValue saveValue;private List<TagBean> tagBeanList = new ArrayList<>();MovieFragmentPagerAdapter pagerAdapter;long timestamp = 0;String token = "";private LinearLayout ll_noNet;private RelativeLayout ll_net;private TextView tv_tip,tv_button;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//init tablayout and view pagermContext = MainActivity.this;saveValue = SaveValue.getInstance(mContext);
//        getToken();initView();if (CommonUtils.getInstance(mContext).isNetworkConnected()) {//init demo tab datall_net.setVisibility(View.VISIBLE);ll_noNet.setVisibility(View.GONE);getTabCate();
//            Intent intent = new Intent(this, AutoUpdateService.class);
//            startService(intent);}else{ll_noNet.setVisibility(View.VISIBLE);ll_net.setVisibility(View.GONE);}}public int position = 0;public boolean isTabScroll = true;private void initView(){this.pager = (ViewPager) findViewById(R.id.pager);this.tableLayout =  findViewById(R.id.tab);
//        ViewCompat.setElevation(tableLayout, 100);LinearLayout linearLayout = (LinearLayout) tableLayout.getChildAt(0);linearLayout.setShowDividers(LinearLayout.SHOW_DIVIDER_MIDDLE);linearLayout.setDividerDrawable(getResources().getDrawable(R.drawable.tablayout_divider_style));linearLayout.setDividerPadding(12);tableLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {@Overridepublic void onTabSelected(TabLayout.Tab tab) {Log.e(TAG,"onTabSelected    tab.getPosition()="+tab.getPosition());isTabScroll = true;position = tab.getPosition();pager.setCurrentItem(position);}@Overridepublic void onTabUnselected(TabLayout.Tab tab) {Log.e(TAG,"onTabUnselected="+tab.getPosition());}@Overridepublic void onTabReselected(TabLayout.Tab tab) {Log.e(TAG,"onTabReselected="+tab.getContentDescription());}});tableLayout.setOnKeyListener(new View.OnKeyListener() {@Overridepublic boolean onKey(View v, int keyCode, KeyEvent event) {switch (keyCode) {case KeyEvent.KEYCODE_DPAD_CENTER:Log.e(TAG, "setOnKeyListener=======KEYCODE_DPAD_CENTER");break;case KeyEvent.KEYCODE_DPAD_UP:Log.e(TAG, "setOnKeyListener=======KEYCODE_DPAD_UP");break;case KeyEvent.KEYCODE_DPAD_DOWN:tableLayout.clearFocus();isTabScroll = false;tableLayout.setSelectedTabIndicatorColor(getResources().getColor(R.color.white));tableLayout.setTabTextColors(getResources().getColor(R.color.tab_normal_color),getResources().getColor(R.color.white));Log.e(TAG, "setOnKeyListener=======KEYCODE_DPAD_DOWN");break;case KeyEvent.KEYCODE_DPAD_LEFT:Log.e(TAG, "setOnKeyListener=======KEYCODE_DPAD_LEFT==="+isTabScroll);if(position != 0) {pager.setCurrentItem(position - 1);}break;case KeyEvent.KEYCODE_DPAD_RIGHT:pager.setCurrentItem(position+1);
//                        tableLayout.requestFocus();
//                        tableLayout.onHoverChanged(true);Log.e(TAG, "setOnKeyListener=======KEYCODE_DPAD_RIGHT");break;}return false;}});ll_net = findViewById(R.id.ll_net);ll_noNet = findViewById(R.id.ll_noNet);tv_tip = findViewById(R.id.tv_tip);tv_button = findViewById(R.id.btn_settingnet);tv_button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if(tv_button.getText().toString().equals(getResources().getString(R.string.no_net_button))){Intent intent = new Intent("android.settings.SETTINGS");startActivity(intent);}else{getTabCate();}}});}int defaultTab = 0;int defaultTag = 0;//获取标签数据,此处省略private void getTabCate(){……}private void showResponse(final String response, final int status){runOnUiThread(new Runnable() {@Overridepublic void run() {if(status == 1){//init moviefragmentinitMovieFragmentData();//set adapter for moive fragmentpagerAdapter = new MovieFragmentPagerAdapter(mContext,MainActivity.this.getSupportFragmentManager(), fragments, list);pager.setAdapter(pagerAdapter);pager.setCurrentItem(defaultTab);RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) tableLayout.getLayoutParams();if(list.size()<=4){params.addRule(RelativeLayout.CENTER_HORIZONTAL);}else{params.leftMargin = 96;}//tableLayout.setupWithViewPager(pager);}else if(status == 100002){token = CommonUtils.getInstance(mContext).getNewToken();Constant.ACCESSTOKEN = token;getTabCate();}else {
//                    Toast.makeText(MainActivity.this,response+"",Toast.LENGTH_LONG).show();ll_net.setVisibility(View.GONE);ll_noNet.setVisibility(View.VISIBLE);tv_tip.setText(getResources().getString(R.string.server_error));tv_button.setText(getResources().getString(R.string.refresh));}}});}private void initMovieFragmentData(){fragments.clear();for (int i=0;i<list.size();i++) {Bundle data = new Bundle();if(list.get(i).getTag_id() == 2){HistoryFragment2 historyFragment = new HistoryFragment2();fragments.add(historyFragment);}else {data.putInt("categoryID", list.get(i).getTag_id());
//                data.putInt("defaultTag",defaultTag);data.putLong("timestamp",timestamp);data.putString("token",token);MovieFragment2 movieFragment = new MovieFragment2();movieFragment.setArguments(data);fragments.add(movieFragment);}}}@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {Log.e(TAG,"keyevent======onKeyDown==="+isTabScroll);switch(keyCode){case KeyEvent.KEYCODE_DPAD_DOWN:View view = getCurrentFocus();if(isTabScroll){isTabScroll = false;tableLayout.clearFocus();tableLayout.setSelectedTabIndicatorColor(getResources().getColor(R.color.white));tableLayout.setTabTextColors(getResources().getColor(R.color.tab_normal_color),getResources().getColor(R.color.white));
//                    return true;}return false;case KeyEvent.KEYCODE_DPAD_LEFT:View viewl = getCurrentFocus();if(isTabScroll){if(position != 0){
//                        recomputeTlOffset1(position-1);
//                        pager.setCurrentItem(position-1);return false;}return true;}else{return false;}case KeyEvent.KEYCODE_DPAD_RIGHT:View viewr = getCurrentFocus();if(isTabScroll){//                    recomputeTlOffset1(position+1);
//                    pager.setCurrentItem(position+1);return false;}else{return false;}case KeyEvent.KEYCODE_DPAD_UP:View viewu = getCurrentFocus();ViewParent parent = viewu.getParent();//.getParent().getParent();if(position !=1 && CustomRecycleView.positon == 0){tableLayout.requestFocus();tableLayout.setSelectedTabIndicatorColor(getResources().getColor(R.color.tab_slelect_text));tableLayout.setTabTextColors(getResources().getColor(R.color.tab_normal_color),getResources().getColor(R.color.tab_slelect_text));isTabScroll = true;return true;}else if(position ==1 && HistoryFragment2.hisPosition == 0){//(CustomRecycleView.positon == 0 && position ==1){HistoryFragment2 historyFragment = (HistoryFragment2)fragments.get(position);historyFragment.onKeyDownFragment(keyCode, event);return true;}break;case KeyEvent.KEYCODE_DPAD_CENTER:Log.e(TAG,"keyevent======onKeyDown==KEYCODE_DPAD_CENTER=");break;case KeyEvent.KEYCODE_BACK:if(!isTabScroll){tableLayout.requestFocus();isTabScroll = true;if(position == 1){HistoryFragment2 historyFragment = (HistoryFragment2)fragments.get(position);historyFragment.onKeyDownFragment(keyCode, event);}tableLayout.setSelectedTabIndicatorColor(getResources().getColor(R.color.tab_slelect_text));tableLayout.setTabTextColors(getResources().getColor(R.color.tab_normal_color),getResources().getColor(R.color.tab_slelect_text));return true;}else{finish();}break;}return super.onKeyDown(keyCode, event);}@Overridepublic boolean onKeyUp(int keyCode, KeyEvent event){return super.onKeyUp(keyCode, event);}protected void onDestory(){super.onDestroy();System.exit(0);}public void onBackPressed(){super.onBackPressed();Log.e(TAG,"onBackPressed");}public Handler myHandler = new Handler(){@Overridepublic void handleMessage(Message message){switch (message.what){case Constant.NO_NET:ll_net.setVisibility(View.GONE);ll_noNet.setVisibility(View.VISIBLE);tv_tip.setText(getResources().getString(R.string.no_net));tv_button.setText(getResources().getString(R.string.no_net_button));break;case Constant.SERVER_ERROR:ll_net.setVisibility(View.GONE);ll_noNet.setVisibility(View.VISIBLE);tv_tip.setText(getResources().getString(R.string.server_error));tv_button.setText(getResources().getString(R.string.refresh));break;}}};
}

CustomTabLayout.java


import android.content.Context;
import android.support.design.widget.TabLayout;
import android.util.AttributeSet;
import android.util.Log;
import android.view.KeyEvent;import com.hisense.movienow.MainActivity;/*** Created by wangcm on 2018/12/20.*/public class CustomTabLayout extends TabLayout {private static final String TAG = "CustomTabLayout";private Context mContext;public CustomTabLayout(Context context) {super(context);this.mContext = context;}public CustomTabLayout(Context context, AttributeSet attrs) {super(context, attrs);this.mContext = context;}public CustomTabLayout(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);this.mContext = context;}public static int tabPosition = 0;public boolean dispatchKeyEvent(KeyEvent event) {tabPosition = getSelectedTabPosition();switch (event.getKeyCode()){case KeyEvent.KEYCODE_DPAD_LEFT:Log.e(TAG,"dispatchKeyEvent===========KeyEvent.KEYCODE_DPAD_LEFT"+tabPosition);if(event.getAction() == KeyEvent.ACTION_UP){return true;}else {setScrollPosition(tabPosition,-1,true);tabPosition-=1;((MainActivity)mContext).pager.setCurrentItem(tabPosition);}return true;case KeyEvent.KEYCODE_DPAD_RIGHT:Log.e(TAG,"dispatchKeyEvent===========KeyEvent.KEYCODE_DPAD_RIGHT"+tabPosition);if(event.getAction() == KeyEvent.ACTION_UP){return true;}else {setScrollPosition(tabPosition,1,true);tabPosition+=1;((MainActivity)mContext).pager.setCurrentItem(tabPosition);return true;}}return super.dispatchKeyEvent(event);}
}

1. 按键处理:

当按右键时,按键不拦截,返回false,进入到CustomTabLayout中去处理。

当按左键时,position不为0时,按键不拦截,返回false,当position为0时,按键要拦截,返回true,否则当焦点移动到第一个,再按一次左键时,焦点会弹回第二项上。

tabLayout当tab数目较多,一屏无法展示时,按键有时会没有反应相关推荐

  1. tabLayout+viewPager+fragment,当tab数目较少,能一屏展示时

    最近做了个推荐影片的APP,根据标签展示不同的视频列表,用遥控器上下左右按键来操作标签.当标签数目较少,能一屏展示时的代码如下: acivity_main.xml <?xml version=& ...

  2. android开发实现tab,Android 开发之获得Tablayout中子Tab所在的View

    最近项目中想做一个新手提示的功能,就是在指定的View上弹出一个类似PopupView的气泡提示框. 效果见下图: Screenshot_20170426-151801_01.png 预想在TabLa ...

  3. Tablayout之Tab宽度左右无法填充

    Tablayout之Tab背景显示 前段时间做一个项目使用到了Tablayout,可以用来实现类似知乎分栏的效果要使用Tablayout,必须引用Google的Android Support Desi ...

  4. js大屏导出图片_超大图片全屏动态展示js插件

    intense-images是一款非常实用的超大图片全屏动态展示js插件.该图片查看插件可以全屏显示超大图片,可以使用鼠标来和图片进行交互,上下左右移动鼠标会相应的移动图片,对于超大图片的展示是非常好 ...

  5. jquery3和layui冲突导,致使用layui.layer.full弹出全屏iframe窗口时高度152px问题

    项目中使用的jquery版本是jquery-3.2.1,在使用layui弹出全屏iframe窗口时,iframe窗口顶部总是出现一个152px高的滚动窗口无法实现真正全屏,代码如下: <!DOC ...

  6. 【转】设备数据通过Azure Functions 推送到 Power BI 数据大屏进行展示

    设备数据通过Azure Functions 推送到 Power BI 数据大屏进行展示(1.准备工作) 原创 Sean Yu 云计算实战 2019-12-06 本案例适用于开发者入门理解Azure F ...

  7. 数据大屏可视化展示系统有什么作用

    数据大屏可视化展示系统指的是用在大数据领域前端实时显示的显示屏,这在当前数字化经济兴起的今天越来越普及,比如一些企业的展厅或者控制室都会打造一个显示大数据平台用来展示企业的各种数据,帮助管理人员分析各 ...

  8. 大屏数据展示,5.5寸大屏幕手机更受消费者喜爱

    智能手机从出现到热销,再到主导人们的生活,并没有花费太长时间.功能越来越多,屏幕越来越大,人们曾经一度认为手机的尺寸可能无限变大,乃至于取代电脑.但是,人们对手机便携性的需求毕竟还是相当高的,所以手机 ...

  9. python flask大作业,疫情数据大屏可视化展示

    整体效果 功能描述 本作业从MongoDB取出中国和世界疫情的相关数据进行处理和分析,然后将处理好的数据以Json的形式分别加载到相应的网站,基于ajax异步加载实现轮询,设定每一个小时发起一次请求, ...

最新文章

  1. 栈的输出_栈和队列--十进制转化为二进制
  2. Spring Data JPA例子[基于Spring Boot、Mysql]
  3. 9.10 css
  4. 备战数学建模国赛,快速搞定算法模型!
  5. 软件层面可以做到重启本地串口吗_手机关机还是重启好?get这几招,手机更流畅...
  6. js对html节点的操作
  7. 货物与产品的区别_超市货架和仓储式货架有什么区别?
  8. python oracle orm_Python - ORM(数据库相关)
  9. python functools
  10. Java 8 vs. Scala(二):Stream vs. Collection
  11. android can为啥能发收不到数据_大数据显示:报读MBA已是未来竞争力提升的必然趋势...
  12. PHP IE下载时提示”无法复制 无法读取源文件或磁盘”的解决办法
  13. 从官网通过execl制作省市区行政代码
  14. as常用固定搭配_英语常用固定搭配
  15. 走进波分 -- 03.光纤传输系统关键参数
  16. 探秘西诚慧联巧匠化工安全综合管理平台——实现厂区安全智能管控
  17. 计算机配件出口单证,出口制单
  18. 智能车基础学习FTM模块
  19. 解决 fxp/composer-asset-plugin 包报错问题
  20. 英国告急!无油可售!加油站大排长龙 | 经济学人早报精选

热门文章

  1. 一行代码“黑”掉任意网站
  2. 北京公交一卡通可打公用电话 节省60%话费
  3. 实名推荐的神器,你安排上了几款?
  4. java程序员在交接别人的工作时如何保证顺利交接?
  5. 1707. [Usaco2007 Nov]tanning分配防晒霜
  6. 第二章 UT单元测试——GTest框架实例
  7. 心理专家浅谈舍弃不必要的虚荣!
  8. 8款电子邮件客户端比较【转】
  9. html文本格式化标签
  10. android23 登录我微信,微信7.0.23正式版