侧滑+Fragment切换+TabLayout切换

1.MainActivity

package com.example.practice;
import android.support.design.widget.TabLayout;
import android.support.v4.view.ViewPager;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.MenuItem;
public class MainActivity extends AppCompatActivity {
    private ActionBarDrawerToggle toggle;
    private DrawerLayout drawerLayout;
    private ViewPager contents;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        if (savedInstanceState==null){
            //添加左滑动视图
            getSupportFragmentManager().beginTransaction().add(R.id.left_drawer,new LeftFragment()).commit();
        }
        initView();
    }

	private void initView() {
        //开启ActionBar左边的icon
        getSupportActionBar().setDisplayShowHomeEnabled(true);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        drawerLayout = findViewById(R.id.drawer);
        toggle = new ActionBarDrawerToggle(this, drawerLayout, R.string.open, R.string.close);
        //同步设置,在滑动切换主页面和左滑动视图时,标题栏也跟着改变
        toggle.syncState();
        drawerLayout.addDrawerListener(toggle);
        contents = findViewById(R.id.contents);
        contents.setAdapter(new MainPageAdapter(getSupportFragmentManager()));
        TabLayout tabLayout = findViewById(R.id.bottom_indicator);
        //使tabLayout和contents结合起来
        tabLayout.setupWithViewPager(contents);
    }

    //点击侧滑里面的条目显示对应的fragment
    public void showPage(int position) {
        contents.setCurrentItem(position);
        drawerLayout.closeDrawer(Gravity.START);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (item.getItemId() == android.R.id.home) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    public void onBackPressed() {
        @SuppressLint("WrongViewCast") DrawerLayout drawer = (DrawerLayout) findViewById(R.id.left_drawer);
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        } else {
            super.onBackPressed();
        }
    }
}

2.HomePagerAdapter 页面

package com.example.practice;

import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;

public class HomePagerAdapter extends FragmentPagerAdapter {
	//定义tabLayout的切换内容
    private String[] pageNames=new String[]{"推荐","小视频","视频","热点","北京","娱乐","财经","军事"};
    public HomePagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int i) {
    //给Fragment对应的TabLayout赋值
        switch (i){
            case 0:
                return new RecommendFragment();
            default:
                return new BaseFragment();

        }
    }

    @Nullable
    @Override
    public CharSequence getPageTitle(int position) {
    	//获取当前TabLayout的内容
        return pageNames[position];
    }
	//获取tabLayout的数组长度
    @Override
    public int getCount() {
        return pageNames.length;
    }
}

3.BaseFragment 页面—TabLayout被复用的页面

package com.example.practice;

import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class BaseFragment extends Fragment {
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        TextView textView=new TextView(getActivity());
        textView.setText("页面");
        return textView;
    }
}

VideoFragment 页面----视频Fragment

package com.example.practice;

import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class VideoFragment extends Fragment {
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        TextView textView=new TextView(getActivity());
        textView.setText(getClass().getSimpleName());
        return textView;
    }
}

MineFragment 页面----我的Fragment

package com.example.practice;

import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class MineFragment extends Fragment {
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        TextView textView=new TextView(getActivity());
        textView.setText(getClass().getSimpleName());
        return textView;
    }
}

RecommendFragment 页面—TabLayout推荐页面

package com.example.practice;

import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class RecommendFragment extends Fragment {
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        TextView textView=new TextView(getActivity());
        textView.setText("推荐");
        return textView;
    }
}

MainPageAdapter ----主页适配器

package com.example.practice;

import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;

public class MainPageAdapter extends FragmentPagerAdapter {
    private String[] menus=new String[]{
            "首页","视频","我的"
    };
    public MainPageAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int i) {
        switch (i){
            case 0:
                return new HomeFragment();
            case 1:
                    return new VideoFragment();
            case 2:
                return new MineFragment();
            default:
                    return new Fragment();
        }
    }
//获取Fragment长度
    @Override
    public int getCount() {
        return menus.length;
    }

    @Nullable
    @Override
    public CharSequence getPageTitle(int position) {
        return menus[position];
    }
}

LeftMenuAdapter 页面----侧滑Fragment适配器

package com.example.practice;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class LeftMenuAdapter extends BaseAdapter {
//定义数组
    private String[] menus=new String[]{
            "首页","视频","我的"
    };
    private Context context;

    public LeftMenuAdapter(Context context) {
        this.context = context;
    }

    @Override
    public int getCount() {
        return menus.length+1;
    }
    private final int ITEM_COUTN=2;
    private final int IMAGE_TYPE=0;
    private final int TEXT_TYPE=1;

    @Override
    public int getViewTypeCount() {
        return ITEM_COUTN;
    }

    @Override
    public int getItemViewType(int position) {
        return position==0?IMAGE_TYPE:TEXT_TYPE;
    }

    @Override
    public String getItem(int position) {
        if (position==0){
            return null;
        }
        return menus[position-1];
    }


    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView==null){
            convertView=LayoutInflater.from(context).inflate(
                    getItemViewType(position)==IMAGE_TYPE?R.layout.menu_image_item:R.layout.menu_text_item
                    ,parent,false
            );
            holder=new ViewHolder(convertView);
        }else {
            holder= (ViewHolder) convertView.getTag();
        }
        if (getItemViewType(position)==TEXT_TYPE){
            holder.bindData(getItem(position));
        }
        return convertView;
    }
    class ViewHolder{
        ImageView imageView;
        TextView textView;

        public ViewHolder(View itemView) {
            imageView=itemView.findViewById(R.id.icon);
            textView=itemView.findViewById(R.id.text);
            itemView.setTag(this);
        }
        public void bindData(String text){
            textView.setText(text);
        }
        public void displayIcon(){

        }
    }
}

LeftFragment 页面----侧滑Fragment

package com.example.practice;

import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ListView;

public class LeftFragment extends Fragment {
    private ListView menus;
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_left_drawer,container,false);
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        menus=view.findViewById(R.id.menus);
        menus.setAdapter(new LeftMenuAdapter(getActivity()));
        //listView点击事件
        menus.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                if (position==0){
                    return;
                }
                ((MainActivity)getActivity()).showPage(position-1);
            }
        });
    }
}

HomeFragment 页面----首页Fragment

package com.example.practice;

import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class HomeFragment extends Fragment {
    private TabLayout tabLayout;
    private ViewPager contents;
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_home,container,false);
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        tabLayout=view.findViewById(R.id.top_indicator);
        contents=view.findViewById(R.id.contents);
        //ViewPager设置适配器
        contents.setAdapter(new HomePagerAdapter(getChildFragmentManager()));
        同步TabLayout和ViewPager
        tabLayout.setupWithViewPager(contents);
    }
}

activity_main.xml页面

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/drawer"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <!--  内容布局 菜单布局: layout_gravity -->
    <!--  match_parent 根据父布局适应 wrap_content 根据内容适应 -->
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <android.support.design.widget.TabLayout
            android:id="@+id/bottom_indicator"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            app:tabTextColor="@color/colorPrimary"
            app:tabSelectedTextColor="@color/colorAccent"
            app:tabIndicatorColor="@android:color/transparent"
            app:tabIndicatorHeight="1dp"
            />
        <!-- app:tabTextAppearance="" -->
        <android.support.v4.view.ViewPager
            android:id="@+id/contents"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_above="@id/bottom_indicator"/>
    </RelativeLayout>
    <FrameLayout
        android:id="@+id/left_drawer"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:background="#ffffff" />
</android.support.v4.widget.DrawerLayout>

fragment_home.xml页面

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <!--  填充是 0dp,并根据约束来做 -->
    <android.support.design.widget.TabLayout
        android:id="@+id/top_indicator"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:tabMode="scrollable"
        />
    <android.support.v4.view.ViewPager
        android:id="@+id/contents"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@id/top_indicator"
        app:layout_constraintBottom_toBottomOf="parent"/>
</android.support.constraint.ConstraintLayout>

fragment_left_drawer.xml页面

<?xml version="1.0" encoding="utf-8"?>
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/menus"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

menu_image_item.xml页面

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingTop="10dp"
    android:paddingBottom="10dp"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <ImageView
        android:id="@+id/icon"
        android:layout_width="100dp"
        android:layout_height="100dp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        android:src="@mipmap/ic_launcher"/>

</android.support.constraint.ConstraintLayout>

menu_text_item.xml页面

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/text"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="20dp"/>

猜你喜欢

转载自blog.csdn.net/Hyy2162427252/article/details/84110152