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">
<RelativeLayout
android:id="@+id/ll_net"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.hisense.movienow.widget.CustomTabLayout
android: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>
<View
android: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.ViewPager
android:id="@+id/pager"
android:layout_below="@+id/tab"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v4.view.ViewPager>
</RelativeLayout>
<LinearLayout
android:id="@+id/ll_noNet"
android:visibility="gone"
android:orientation="vertical"
android:gravity="center"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:src="@drawable/ic_network"
android:layout_width="300px"
android:layout_height="300px" />
<TextView
android: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" />
<TextView
android: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;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//init tablayout and view pager
mContext = MainActivity.this;
saveValue = SaveValue.getInstance(mContext);
// getToken();
initView();
if (CommonUtils.getInstance(mContext).isNetworkConnected()) {
//init demo tab data
ll_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() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
Log.e(TAG,"onTabSelected tab.getPosition()="+tab.getPosition());
isTabScroll = true;
position = tab.getPosition();
pager.setCurrentItem(position);
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
Log.e(TAG,"onTabUnselected="+tab.getPosition());
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
Log.e(TAG,"onTabReselected="+tab.getContentDescription());
}
});
tableLayout.setOnKeyListener(new View.OnKeyListener() {
@Override
public 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() {
@Override
public 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() {
@Override
public void run() {
if(status == 1){
//init moviefragment
initMovieFragmentData();
//set adapter for moive fragment
pagerAdapter = 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);
}
}
}
@Override
public 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);
}
@Override
public 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(){
@Override
public 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,否则当焦点移动到第一个,再按一次左键时,焦点会弹回第二项上。