目录
首先导入依赖 :implementation 'com.android.support:design:28.0.0'
Fragment
把页面分为多个部分,提高页面利用率
ViewPager
实现视图左右滑动效果
TabLayout
可以实现滑动效果的标题栏,灵活多变
如何使用
1、完成TabLayout
//添加控件
<android.support.design.widget.TabLayout
android:id="@+id/tabLayout"
android:layout_width="match_parent" />
//初始化
tabLayout.addTab(tabLayout.newTab().setText(tab));
//监听事件
tabLayout.addOnTabSelectedListener(this);
2、首先让TabLayout和ViewPager绑定在一起
//添加viewpager控件
tabLayout.setupWithViewPager(viewPager);
3、点击TabLayout,切换ViewPager
@Override
public void onTabSelected(TabLayout.Tab tab) {
viewPager.setCurrentItem(tab.getPosition());
}
4、把Fragmnet和ViewPager绑定
//通过FragmentPagerAdapter 适配器,把Fragment作为数据填入到ViewPager中
public class MyPagerAdapter extends FragmentPagerAdapter {
//重写方法
}
FragmentPagerAdapter方法
1、getltem()获得每个item 2、getPagerTitle()获取每一页的标题 3、getcount()获取数据的个数 4、MyPagerAdapter()有参构造方法
案例
直接上代码
首先导入依赖 :implementation 'com.android.support:design:28.0.0'
Actiity页面布局
<?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:orientation="vertical"
android:layout_height="match_parent"
tools:context=".MainActivity">
<android.support.design.widget.TabLayout
android:id="@+id/tab_id"
app:tabSelectedTextColor="#E5AF35"
app:tabTextColor="#969696"
app:tabIndicatorColor="#E5AF35"
app:tabIndicatorHeight="5dp"
app:tabMode="scrollable"
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="0dp">
</android.support.design.widget.TabLayout>
<android.support.v4.view.ViewPager
android:id="@+id/vp_id"
android:layout_weight="8"
android:layout_width="match_parent"
android:layout_height="0dp">
</android.support.v4.view.ViewPager></LinearLayout>
核心代码(方法)
MainAtivity代码
public class MainActivity extends AppCompatActivity {
private TabLayout tabId;
private ViewPager vpId;
private List<Fragment> list = new ArrayList<>();
private List<String> titles = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
supportRequestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
tabId = findViewById(R.id.tab_id);
vpId = findViewById(R.id.vp_id);
list.add(new OneFragment());
list.add(new TwoFragment());
list.add(new OneFragment());
list.add(new TwoFragment());
titles.add("视频");
titles.add("新闻");
titles.add("图片");
titles.add("留言");
MyFragmentAdapter myFragmentAdapter = new MyFragmentAdapter(getSupportFragmentManager(), list, titles);
vpId.setAdapter(myFragmentAdapter);
//把viewPager和tabLayout绑定在一起,注释掉看看效果.
tabId.setupWithViewPager(vpId);
适配器代码,MyFragmentAdapter.java
public class MyFragmentAdapter extends FragmentStatePagerAdapter {
private List<Fragment> list;
private List<String> titles;
public MyFragmentAdapter(FragmentManager fm, List<Fragment> list, List<String> titles) {
super(fm);
this.list = list;
this.titles = titles;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Fragment getItem(int i) {
return list.get(i);
}
@Override
public CharSequence getPageTitle(int position) {
return titles.get(position);
}}
Fragment创建一个空白页面里面代码
public class OneFragment extends Fragment {
public OneFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_one, container, false);
}}
Banner
Banner效果
实现效果:第一步(依赖起手):
implementation 'com.github.bumptech.glide:glide:3.7.0'
implementation 'com.youth.banner:banner:1.4.9‘
第二步:编写布局
<com.youth.banner.Banner
android:id="@+id/banner"
android:layout_width="match_parent"
android:layout_height="200dp">
</com.youth.banner.Banner>
第三步:创建Banner对象,设置属性
public class MainActivity extends AppCompatActivity implements OnBannerListener {
private Banner banner;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
banner = findViewById(R.id.banner);//一定要布局文件之后获取ID
List<Integer> imageList = new ArrayList<>();
int[] imageIDs = new int[]{R.drawable.gao, R.drawable.yun, R.drawable.img1};
List<String> nameList = new ArrayList<>();
String[] names = new String[]{"1", "2", "3", "4"};
imageList.add(imageIDs[0]);
imageList.add(imageIDs[1]);
imageList.add(imageIDs[2]);
nameList.add(names[0]);
nameList.add(names[1]);
nameList.add(names[2]);
banner.setBannerStyle(BannerConfig.CIRCLE_INDICATOR_TITLE_INSIDE);
//圆点指示器(标题inside)
banner.setBannerTitles(nameList);
banner.setImages(imageList);
banner.setImageLoader(new MyLoader());
//设置图片加载器
banner.setBannerAnimation(Transformer.FlipHorizontal);
//动画
banner.setOnBannerListener(this);
//点击图片事件
banner.setDelayTime(1000);
banner.isAutoPlay(true);
banner.setIndicatorGravity(BannerConfig.CENTER);
banner.start();
}
EventBus
为什么使用EventBus
EventBus的三个角色
EventBus的线程模式
EventBus的应用
1、依赖起手
implementation 'org.greenrobot:eventbus:3.1.1'
2、定义事件
public class MessageWrap {
public final String message;
public static MessageWrap getInstance(String message) {
return new MessageWrap(message);
}
private MessageWrap(String message) {
this.message = message;
}
}
3、发布事件
@Route(path = BaseConstants.LIBRARY_EVENT_BUS_ACTIVITY1)
public class EventBusActivity1 extends CommonActivity<ActivityEventBus1Binding> {
@Override
protected void doCreateView(Bundle savedInstanceState) {
// 为按钮添加添加单击事件
getBinding().btnReg.setOnClickListener(v -> EventBus.getDefault().register(this));
getBinding().btnNav2.setOnClickListener( v ->
ARouter.getInstance()
.build(BaseConstants.LIBRARY_EVENT_BUS_ACTIVITY2)
.navigation());
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onGetMessage(MessageWrap message) {
getBinding().tvMessage.setText(message.message);
}
}
4、Activity中注册监听黏性事件
@Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
public void onGetStickyEvent(MessageWrap message) {
String txt = "Sticky event: " + message.message;
getBinding().tvStickyMessage.setText(txt);
}
5、发布黏性事件
private void publishStickyontent() {
String msg = getBinding().etMessage.getText().toString();
EventBus.getDefault().postSticky(MessageWrap.getInstance(msg));
ToastUtils.makeToast("Published : " + msg);
}