功能:
1、顶部导航栏,ViewPager滑动切换页面也可以点击导航栏切换,点击页面上的按钮可跳转activity
2、底部指示器,根据页面的切换进行联动变换
3、左上角菜单栏,PopupWindow悬浮框,可实现微信右上角“+”的功能
为了避免浪费时间,首先看一下效果图是否满足需求。
接下来看项目的主要组成部分:
代码部分:
activity_main主要代码:
<RadioGroup
android:id="@+id/rg_tab_bar"
android:layout_below="@+id/ly_top_bar"
android:layout_width="match_parent"
android:layout_height="56dp"
android:background="@color/bg_white"
android:orientation="horizontal">
<RadioButton
android:id="@+id/rb_channel"
style="@style/tab_menu_item"
android:drawableTop="@drawable/tab_menu_channel"
android:text="@string/tab_menu_alert" />
<RadioButton
android:id="@+id/rb_message"
style="@style/tab_menu_item"
android:drawableTop="@drawable/tab_menu_message"
android:text="@string/tab_menu_profile" />
<RadioButton
android:id="@+id/rb_better"
style="@style/tab_menu_item"
android:drawableTop="@drawable/tab_menu_better"
android:text="@string/tab_menu_pay" />
<RadioButton
android:id="@+id/rb_setting"
style="@style/tab_menu_item"
android:drawableTop="@drawable/tab_menu_setting"
android:text="@string/tab_menu_setting" />
</RadioGroup>
<androidx.viewpager.widget.ViewPager
android:id="@+id/vpager"
android:layout_alignParentBottom="true"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/div_tab_bar" />
<LinearLayout
android:id="@+id/point_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:layout_alignParentBottom="true"
android:orientation="horizontal">
</LinearLayout>
DevicePopWindow完整代码:
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.PopupWindow;
import android.widget.TextView;
public class DevicePopWindow extends PopupWindow implements View.OnClickListener {
private Context context;
public DevicePopWindow(Context context){
super(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
this.context=context;
//这里要注意设置setOutsideTouchable之前要设置 setBackgroundDrawable()
//否则点击外部无法关闭pop
setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
setOutsideTouchable(true);
//获取焦点设置为true 这样再次点击菜单时 就隐藏菜单
setFocusable(true);
View inflate = LayoutInflater.from(context).inflate(R.layout.menu, null);
TextView tv_1=inflate.findViewById(R.id.tv_1);
TextView tv_2=inflate.findViewById(R.id.tv_2);
TextView tv_3=inflate.findViewById(R.id.tv_3);
TextView tv_4=inflate.findViewById(R.id.tv_4);
tv_1.setOnClickListener(this);
tv_2.setOnClickListener(this);
tv_3.setOnClickListener(this);
tv_4.setOnClickListener(this);
setContentView(inflate);
//设置窗口进入和退出的动画
setAnimationStyle(R.style.pop_add);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.tv_1:
Intent intent=new Intent(context,TwoActivity.class);
context.startActivity(intent);
break;
case R.id.tv_2:
break;
case R.id.tv_3:
break;
case R.id.tv_4:
break;
}
}
}
MainActivity完整代码:
import androidx.appcompat.app.AppCompatActivity;
import androidx.viewpager.widget.ViewPager;
import android.os.Bundle;
import android.view.View;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity implements RadioGroup.OnCheckedChangeListener, ViewPager.OnPageChangeListener, View.OnClickListener {
private TextView txt_topbar;
private RadioGroup rg_tab_bar;
private RadioButton rb_channel;
private RadioButton rb_message;
private RadioButton rb_better;
private RadioButton rb_setting;
private ViewPager vpager;
private MyFragmentPagerAdapter mAdapter;
//几个代表页面的常量
public static final int PAGE_ONE = 0;
public static final int PAGE_TWO = 1;
public static final int PAGE_THREE = 2;
public static final int PAGE_FOUR = 3;
private ImageView menus;
DevicePopWindow devicePopWindow;
private LinearLayout mPointContainer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//全屏显示
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
mAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager());
initView();
rb_channel.setChecked(true);
devicePopWindow=new DevicePopWindow(this);
}
private void initView() {
txt_topbar = findViewById(R.id.txt_topbar);
rg_tab_bar = findViewById(R.id.rg_tab_bar);
rb_channel = findViewById(R.id.rb_channel);
rb_message = findViewById(R.id.rb_message);
rb_better = findViewById(R.id.rb_better);
rb_setting = findViewById(R.id.rb_setting);
rg_tab_bar.setOnCheckedChangeListener(this);
vpager = findViewById(R.id.vpager);
vpager.setAdapter(mAdapter);
vpager.setCurrentItem(0);
vpager.addOnPageChangeListener(this);
menus=findViewById(R.id.menus);
menus.setOnClickListener(this) ;
//找到放指示器的容器
mPointContainer = (LinearLayout) findViewById(R.id.point_container);
//根据页面个数添加指示器的个数
insertPoint();
}
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
switch (checkedId) {
case R.id.rb_channel:
vpager.setCurrentItem(PAGE_ONE);
break;
case R.id.rb_message:
vpager.setCurrentItem(PAGE_TWO);
break;
case R.id.rb_better:
vpager.setCurrentItem(PAGE_THREE);
break;
case R.id.rb_setting:
vpager.setCurrentItem(PAGE_FOUR);
break;
}
}
//重写ViewPager页面切换的处理方法
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
int realPosition;
if (4 != 0) {
realPosition = position % 4;
}else{
realPosition = 0;
}
setSelectPoint(realPosition);
}
@Override
public void onPageScrollStateChanged(int state) {
//state的状态有三个,0表示什么都没做,1正在滑动,2滑动完毕
if (state == 2) {
switch (vpager.getCurrentItem()) {
case PAGE_ONE:
rb_channel.setChecked(true);
break;
case PAGE_TWO:
rb_message.setChecked(true);
break;
case PAGE_THREE:
rb_better.setChecked(true);
break;
case PAGE_FOUR:
rb_setting.setChecked(true);
break;
}
}
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.menus:
devicePopWindow.showAsDropDown(v, -150, 10);
break;
}
}
//根据页面个数添加指示器的个数
private void insertPoint() {
for(int i = 0; i < 4; i++){
View point = new View(MainActivity.this);
//定义每个point 所在子布局的宽高属性
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(40, 40);
layoutParams.leftMargin = 20;
if (i==0){
point.setBackground(getResources().getDrawable(R.drawable.shape_point_selected)); //将point的背景设置为事先定义好的形状
}else {
point.setBackground(getResources().getDrawable(R.drawable.shape_point_normal)); //将point的背景设置为事先定义好的形状
}
//设置POINT 的布局属性
point.setLayoutParams(layoutParams);
//将point加入到父布局中
mPointContainer.addView(point);
}
}
//设置指示器余页面的联动
private void setSelectPoint(int realPostion) {
for(int i = 0; i < mPointContainer.getChildCount(); i++){
View point = mPointContainer.getChildAt(i);
if (i == realPostion) {
point.setBackgroundResource(R.drawable.shape_point_selected);
}else{
point.setBackgroundResource(R.drawable.shape_point_normal);
}
}
}
}
MyFragment1完整代码:(MyFragment2、MyFragment3、MyFragment4近乎相同)
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.fragment.app.Fragment;
public class MyFragment1 extends Fragment {
TextView txt_content;
public MyFragment1() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fg_content, container, false);
txt_content = view.findViewById(R.id.txt_content);
txt_content.setText("第一个页面");
txt_content.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(getActivity(),TwoActivity.class);
startActivity(intent);
}
});
return view;
}
}
MyFragmentPagerAdapter完整代码:
import android.view.ViewGroup;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentPagerAdapter;
public class MyFragmentPagerAdapter extends FragmentPagerAdapter {
private final int PAGER_COUNT = 4;
private MyFragment1 myFragment1 = null;
private MyFragment2 myFragment2 = null;
private MyFragment3 myFragment3 = null;
private MyFragment4 myFragment4 = null;
public MyFragmentPagerAdapter(FragmentManager fm) {
super(fm);
myFragment1 = new MyFragment1();
myFragment2 = new MyFragment2();
myFragment3 = new MyFragment3();
myFragment4 = new MyFragment4();
}
@Override
public int getCount() {
return PAGER_COUNT;
}
@Override
public Object instantiateItem(ViewGroup vg, int position) {
return super.instantiateItem(vg, position);
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
System.out.println("position Destory" + position);
super.destroyItem(container, position, object);
}
@Override
public Fragment getItem(int position) {
Fragment fragment = null;
switch (position) {
case MainActivity.PAGE_ONE:
fragment = myFragment1;
break;
case MainActivity.PAGE_TWO:
fragment = myFragment2;
break;
case MainActivity.PAGE_THREE:
fragment = myFragment3;
break;
case MainActivity.PAGE_FOUR:
fragment = myFragment4;
break;
}
return fragment;
}
}
fragment参考:Android基础入门教程——5.2.4 Fragment实例精讲——底部导航栏+ViewPager滑动切换页面_coder-pig的博客-CSDN博客