【已解决】 点击Indicator无反应,应该怎么办?
- 在完成喜马拉雅项目.视频教程5,使用适配器Indicator时,跟着视频敲完代码后,点击上方的指示器无效,不能实现界面转换。只能通过拉动内容部分界面才能转。
调试情况:

↑图片显示:“指示器Adapter” 的onTabClickListener其实不为空,但是就是没有点击跳转内容页。
---

↑在点击指示器时,程序没有进入过onTabClick函数

1、 上网尝试把指示器的标签添加属性:android:clickable="true",没有效果。
2、跟XimalayaDemo的源码对比过两次,没有找出不一样的地方(除了版本问题,源码是用support库,我用的是AndroidX)
----------------------------------------------------------------------------------------------------------------------------------------------------
代码
MainActivity.java
package com.project.myxima;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentPagerAdapter;
import androidx.viewpager.widget.ViewPager;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import com.project.myxima.adapters.IndicatorAdapter;
import com.project.myxima.adapters.MainContentAdapter;
import com.project.myxima.utils.LogUtils;
import com.ximalaya.ting.android.opensdk.datatrasfer.CommonRequest;
import com.ximalaya.ting.android.opensdk.datatrasfer.IDataCallBack;
import com.ximalaya.ting.android.opensdk.model.category.Category;
import com.ximalaya.ting.android.opensdk.model.category.CategoryList;
import net.lucode.hackware.magicindicator.MagicIndicator;
import net.lucode.hackware.magicindicator.ViewPagerHelper;
import net.lucode.hackware.magicindicator.buildins.commonnavigator.CommonNavigator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class MainActivity extends FragmentActivity {
private static final String TAG = "MainActivity";
private MagicIndicator mMagicIndicator;
private ViewPager mContentPager;
private IndicatorAdapter mIndicatorAdapter;
@RequiresApi(api = Build.VERSION_CODES.M)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initEvent();
}
private void initEvent() {
Log.d(TAG,"进入了initEvent函数");
mIndicatorAdapter.setOnIndicatorTapClickListener(new IndicatorAdapter.OnIndicatorTabClickListener() {
@Override
public void onTabClick(int index) {
Log.d(TAG,"进入了指示器的点击事件");
//点击时改变ContentPager
if(mContentPager != null){
mContentPager.setCurrentItem(index,false);
}
}
});
}
@RequiresApi(api = Build.VERSION_CODES.M)
private void initView() {
mMagicIndicator = this.findViewById(R.id.magic_indicator);
mMagicIndicator.setBackgroundColor(this.getResources().getColor(R.color.main_color));
//指示器的适配器
mIndicatorAdapter = new IndicatorAdapter(this);
CommonNavigator commonNavigator = new CommonNavigator(this);
commonNavigator.setAdjustMode(true);
commonNavigator.setAdapter(mIndicatorAdapter);
//ViewPager
mContentPager = this.findViewById(R.id.content_pager);
//创建内容适配器
FragmentManager fragmentManager = getSupportFragmentManager();
MainContentAdapter mainContentAdapter = new MainContentAdapter(fragmentManager);
mContentPager.setAdapter(mainContentAdapter);
//绑定
mMagicIndicator.setNavigator(commonNavigator);
ViewPagerHelper.bind(mMagicIndicator,mContentPager);//把指示器和内容Pager绑定起来,下面滑动时上面也会滑动
}
}
IndicatorAdapter.java
package com.project.myxima.adapters;
import android.content.Context;
import android.graphics.Color;
import android.util.Log;
import android.view.View;
import com.project.myxima.R;
import net.lucode.hackware.magicindicator.buildins.commonnavigator.abs.CommonNavigatorAdapter;
import net.lucode.hackware.magicindicator.buildins.commonnavigator.abs.IPagerIndicator;
import net.lucode.hackware.magicindicator.buildins.commonnavigator.abs.IPagerTitleView;
import net.lucode.hackware.magicindicator.buildins.commonnavigator.indicators.LinePagerIndicator;
import net.lucode.hackware.magicindicator.buildins.commonnavigator.titles.ColorTransitionPagerTitleView;
import net.lucode.hackware.magicindicator.buildins.commonnavigator.titles.SimplePagerTitleView;
public class IndicatorAdapter extends CommonNavigatorAdapter {
private final String[] mTitles;
private OnIndicatorTabClickListener mOnTabClickListener;
public IndicatorAdapter(Context context) {
mTitles = context.getResources().getStringArray(R.array.indicator_title);
}
@Override
public int getCount() {//数据的个数
if(mTitles != null){
return mTitles.length;
}
return 0;
}
@Override
public IPagerTitleView getTitleView(Context context, final int index) {
/*SimplePagerTitleView simplePagerTitleView = new ColorTransitionPagerTitleView(context);//这里可能//TODO:
simplePagerTitleView.setNormalColor(Color.GRAY);
simplePagerTitleView.setSelectedColor(Color.WHITE);
simplePagerTitleView.setText(mTitle[index]);
simplePagerTitleView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//mTitle.setCurrentItem(index);
//TODO:
if(mOnTabClickListener != null){
mOnTabClickListener.onTabClick(index);
}
}
});
return simplePagerTitleView;*/
//创建view
ColorTransitionPagerTitleView colorTransitionPagerTitleView = new ColorTransitionPagerTitleView(context);
//设置一般情况下的颜色为灰色
colorTransitionPagerTitleView.setNormalColor(Color.parseColor("#aaffffff"));
//设置选中情况下的颜色为黑色
colorTransitionPagerTitleView.setSelectedColor(Color.parseColor("#ffffff"));
//单位sp
colorTransitionPagerTitleView.setTextSize(18);
//设置要显示的内容
colorTransitionPagerTitleView.setText(mTitles[index]);
//设置title的点击事件,这里的话,如果点击了title,那么就选中下面的viewPager到对应的index里面去
//也就是说,当我们点击了title的时候,下面的viewPager会对应着index进行切换内容。
colorTransitionPagerTitleView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//切换viewPager的内容,如果index不一样的话。
if (mOnTabClickListener != null) {
mOnTabClickListener.onTabClick(index);
}else {
Log.d("指示器的适配器", "index为空");
}
}
});
//把这个创建好的view返回回去
return colorTransitionPagerTitleView;
}
@Override
public IPagerIndicator getIndicator(Context context) {
LinePagerIndicator linePagerIndicator = new LinePagerIndicator(context);
linePagerIndicator.setMode(LinePagerIndicator.MODE_WRAP_CONTENT);
linePagerIndicator.setColors(Color.WHITE);
return linePagerIndicator;
}
public void setOnIndicatorTapClickListener(OnIndicatorTabClickListener listener){
this.mOnTabClickListener = listener;
}
public interface OnIndicatorTabClickListener{
void onTabClick(int index);
}
}
layout_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
tools:context=".MainActivity">
<net.lucode.hackware.magicindicator.MagicIndicator
android:id="@+id/magic_indicator"
android:clickable="true"
android:layout_width="match_parent"
android:layout_height="40dp"
/>
<androidx.viewpager.widget.ViewPager
android:id="@+id/content_pager"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</RelativeLayout>
看到你前面的调试了,没进
Log.d(TAG,"进入了指示器的点击事件");
那你就逆推,
到这里
这里也加一些log,或者打断点吧。
你现在现象是点击顶部的tab,没能切换是吧。
Log.d(TAG,"进入了指示器的点击事件");
这个log有输出吗?
问题解决啦
原因:是因为activity_main.xml文件中的跟标签没有设置成LinearLayout,并且设置属性 android:orientation="vertical"。所以点击指示器时根本就没有反应。
解决:修改布局文件并重新运行即可。
更新调试信息
1、未进入到点击函数
1 在MainActivity中,无法进入onTabClick()函数:
2 在IndicatorAdapter中,无法进入onClick函数:
2、Indicator可能存在问题