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

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,否则当焦点移动到第一个,再按一次左键时,焦点会弹回第二项上。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值