一、压缩包

WeChatPage.zip

二、安卓必学:控件jetpack(getLifecycle是jetpack中的一个参数)

三、fragment知识点:

一个activity作为页面的宿主,携带多个fragment在宿主之上显示

四、viewpager知识点:

1.viewpager1提供的两种Adapter:

(1)fragmentPagerAdapter:fragment会缓存,不销毁

(2)FragmentStatePagerAdapter:fragment会走生命周期,会销毁

2.viewpager2提供的一种Adapter:

(1)FragmentStatePagerAdapter

五、viewpager+fragment滑动实现的具体步骤:

1.添加viewpager2依赖,创建viewpager2

image.png

2.创建一个适配器FragmentStateAdapter,这个适配器是系统自带的,是专门为viewpager2提供的adapter。(adapter适配的是fragment,系统有提供一个比较好的adapter)

image.png

3.绑定控件,创建系统自带的适配器对象,在对象里面放入对应的参数,调用这个适配器

image.png

4.定义fragment,进行传参,然后将值放入对应的片段

image.png

5.定义一个集合,将数据放入集合内

image.png

六、viewpager+fragment滑动的整体代码:

1.布局activity_main.xml文件

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. xmlns:tools="http://schemas.android.com/tools"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent"
  7. android:orientation="vertical"
  8. tools:context=".MainActivity">
  9. <androidx.viewpager2.widget.ViewPager2
  10. android:id="@+id/vp_item"
  11. android:layout_width="match_parent"
  12. android:layout_height="0dp"
  13. android:layout_weight="1" />
  14. </LinearLayout>

2.布局fragment_blank.xml文件

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:tools="http://schemas.android.com/tools"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent"
  6. tools:context=".BlankFragment">
  7. <!-- TODO: Update blank fragment layout -->
  8. <TextView
  9. android:id="@+id/tv_item"
  10. android:layout_width="match_parent"
  11. android:layout_height="match_parent"
  12. android:gravity="center"
  13. android:textSize="36dp"
  14. android:text="hello" />
  15. </FrameLayout>

3.MainActivity文件代码

  1. package com.example.wechatpage;
  2. import androidx.appcompat.app.AppCompatActivity;
  3. import androidx.fragment.app.Fragment;
  4. import androidx.viewpager2.widget.ViewPager2;
  5. import android.os.Bundle;
  6. import android.view.View;
  7. import java.util.ArrayList;
  8. public class MainActivity extends AppCompatActivity {
  9. ViewPager2 viewpager;
  10. @Override
  11. protected void onCreate(Bundle savedInstanceState) {
  12. super.onCreate(savedInstanceState);
  13. setContentView(R.layout.activity_main);
  14. initPager();
  15. }
  16. private void initPager() {
  17. viewpager = findViewById(R.id.vp_item);
  18. ArrayList<Fragment> fragments=new ArrayList<>();
  19. fragments.add(BlankFragment.newInstance("微信聊天"));
  20. fragments.add(BlankFragment.newInstance("通讯录"));
  21. fragments.add(BlankFragment.newInstance("发现"));
  22. fragments.add(BlankFragment.newInstance("我"));
  23. MyFragmentPagerAdapter myFragmentPagerAdapter = new MyFragmentPagerAdapter
  24. (getSupportFragmentManager(),getLifecycle(),fragments);
  25. viewpager.setAdapter(myFragmentPagerAdapter);
  26. }
  27. }

4.MyFragmentPagerAdapter文件代码

  1. package com.example.wechatpage;
  2. import androidx.annotation.NonNull;
  3. import androidx.fragment.app.Fragment;
  4. import androidx.fragment.app.FragmentManager;
  5. import androidx.lifecycle.Lifecycle;
  6. import androidx.viewpager2.adapter.FragmentStateAdapter;
  7. import java.util.ArrayList;
  8. import java.util.List;
  9. public class MyFragmentPagerAdapter extends FragmentStateAdapter {
  10. List<Fragment> fragmentList;
  11. public MyFragmentPagerAdapter(@NonNull FragmentManager fragmentManager,
  12. @NonNull Lifecycle lifecycle,List<Fragment> fragmentList) {
  13. super(fragmentManager, lifecycle);
  14. this.fragmentList=fragmentList;
  15. }
  16. @NonNull
  17. @Override
  18. public Fragment createFragment(int position) {
  19. return fragmentList.get(position);
  20. }
  21. @Override
  22. public int getItemCount() {
  23. return fragmentList.size();
  24. }
  25. }

5.BlankFragment文件代码

  1. package com.example.wechatpage;
  2. import android.content.Context;
  3. import android.net.Uri;
  4. import android.os.Bundle;
  5. import androidx.fragment.app.Fragment;
  6. import android.view.LayoutInflater;
  7. import android.view.View;
  8. import android.view.ViewGroup;
  9. import android.widget.TextView;
  10. public class BlankFragment extends Fragment {
  11. private static final String ARG_TEXT= "param1";
  12. private String mTextString;
  13. View rootView;
  14. public BlankFragment() {
  15. }
  16. public static BlankFragment newInstance(String param1) {
  17. BlankFragment fragment = new BlankFragment();
  18. Bundle args = new Bundle();
  19. args.putString(ARG_TEXT, param1);
  20. fragment.setArguments(args);
  21. return fragment;
  22. }
  23. @Override
  24. public void onCreate(Bundle savedInstanceState) {
  25. super.onCreate(savedInstanceState);
  26. if (getArguments() != null) {
  27. mTextString = getArguments().getString(ARG_TEXT);
  28. }
  29. }
  30. @Override
  31. public View onCreateView(LayoutInflater inflater, ViewGroup container,
  32. Bundle savedInstanceState) {
  33. if (rootView==null) {
  34. rootView = inflater.inflate(R.layout.fragment_blank, container, false);
  35. }
  36. initView();
  37. return rootView;
  38. }
  39. private void initView() {
  40. TextView textView = rootView.findViewById(R.id.tv_item);
  41. textView.setText(mTextString);
  42. }
  43. }

6.效果图:

image.png
image.png

七、viewpager+fragment模拟微信首页实现的具体步骤:

1.定义一个layout,专门放下面的布局文件

image.png

2.定义一个drawable,选择点击之前之后的变化

image.png

3.将布局放入主布局,放在viewpager下面

image.png

4.解析xml,响应点击事件,定义布局变量

image.png

5.设置xiewpager2的滑动监听结果

image.png

6.判断对应位置的对应滑动页面,和点击之后滑动对应的页面

image.png

八、viewpager+fragment模拟微信首页的整体代码:

1.布局activity_main.xml文件

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. xmlns:tools="http://schemas.android.com/tools"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent"
  7. android:orientation="vertical"
  8. tools:context=".MainActivity">
  9. <androidx.viewpager2.widget.ViewPager2
  10. android:id="@+id/vp_item"
  11. android:layout_width="match_parent"
  12. android:layout_height="0dp"
  13. android:layout_weight="1" />
  14. <include layout="@layout/bottom_layout"></include>
  15. </LinearLayout>

2.布局fragment_blank.xml文件

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:tools="http://schemas.android.com/tools"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent"
  6. tools:context=".BlankFragment">
  7. <!-- TODO: Update blank fragment layout -->
  8. <TextView
  9. android:id="@+id/tv_item"
  10. android:layout_width="match_parent"
  11. android:layout_height="match_parent"
  12. android:gravity="center"
  13. android:textSize="36dp"
  14. android:text="hello" />
  15. </FrameLayout>

3.布局bottom_layout.xml文件

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. xmlns:tools="http://schemas.android.com/tools"
  5. android:layout_width="match_parent"
  6. android:layout_height="60dp"
  7. android:orientation="horizontal"
  8. android:background="@color/gray">
  9. <LinearLayout
  10. android:id="@+id/ll_chat"
  11. android:layout_width="0dp"
  12. android:layout_height="match_parent"
  13. android:layout_weight="1"
  14. android:layout_gravity="center"
  15. android:orientation="vertical">
  16. <ImageView
  17. android:layout_width="40dp"
  18. android:layout_height="40dp"
  19. android:id="@+id/iv_chat"
  20. android:layout_gravity="center"
  21. android:background="@drawable/tab_chat"
  22. />
  23. <TextView
  24. android:layout_width="match_parent"
  25. android:layout_height="match_parent"
  26. android:id="@+id/tv_chat"
  27. android:gravity="center"
  28. android:text="微信"/>
  29. </LinearLayout>
  30. <LinearLayout
  31. android:id="@+id/ll_contact"
  32. android:layout_width="0dp"
  33. android:layout_height="match_parent"
  34. android:layout_weight="1"
  35. android:layout_gravity="center"
  36. android:orientation="vertical">
  37. <ImageView
  38. android:layout_width="40dp"
  39. android:layout_height="40dp"
  40. android:layout_gravity="center"
  41. android:id="@+id/iv_contact"
  42. android:background="@drawable/tab_chat"
  43. />
  44. <TextView
  45. android:layout_width="match_parent"
  46. android:layout_height="match_parent"
  47. android:id="@+id/tv_contact"
  48. android:gravity="center"
  49. android:text="通讯录"/>
  50. </LinearLayout>
  51. <LinearLayout
  52. android:id="@+id/ll_find"
  53. android:layout_width="0dp"
  54. android:layout_height="match_parent"
  55. android:layout_weight="1"
  56. android:layout_gravity="center"
  57. android:orientation="vertical">
  58. <ImageView
  59. android:layout_width="40dp"
  60. android:layout_height="40dp"
  61. android:id="@+id/iv_find"
  62. android:layout_gravity="center"
  63. android:background="@drawable/tab_chat"
  64. />
  65. <TextView
  66. android:layout_width="match_parent"
  67. android:layout_height="match_parent"
  68. android:id="@+id/tv_find"
  69. android:gravity="center"
  70. android:text="发现"/>
  71. </LinearLayout>
  72. <LinearLayout
  73. android:id="@+id/ll_me"
  74. android:layout_width="0dp"
  75. android:layout_height="match_parent"
  76. android:layout_weight="1"
  77. android:layout_gravity="center"
  78. android:orientation="vertical">
  79. <ImageView
  80. android:layout_width="40dp"
  81. android:layout_height="40dp"
  82. android:layout_gravity="center"
  83. android:id="@+id/iv_me"
  84. android:background="@drawable/tab_chat"
  85. />
  86. <TextView
  87. android:layout_width="match_parent"
  88. android:layout_height="match_parent"
  89. android:id="@+id/tv_me"
  90. android:gravity="center"
  91. android:text="我"/>
  92. </LinearLayout>
  93. </LinearLayout>

4.tab_chat.xml点击之前点击之后的drawable文件

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <selector xmlns:android="http://schemas.android.com/apk/res/android">
  3. <item android:drawable="@drawable/chat_pressed" android:state_selected="true"/>
  4. <item android:drawable="@drawable/chat_normal" />
  5. </selector>

5.MainActivity文件代码

  1. package com.example.wechatpage;
  2. import androidx.appcompat.app.AppCompatActivity;
  3. import androidx.fragment.app.Fragment;
  4. import androidx.viewpager2.widget.ViewPager2;
  5. import android.os.Bundle;
  6. import android.view.View;
  7. import android.widget.ImageView;
  8. import android.widget.LinearLayout;
  9. import java.util.ArrayList;
  10. public class MainActivity extends AppCompatActivity implements View.OnClickListener{
  11. ViewPager2 viewpager;
  12. private LinearLayout ll_chat,ll_contact,ll_find,ll_me;
  13. private ImageView iv_chat,iv_contact,iv_find,iv_me,iv_current;
  14. @Override
  15. protected void onCreate(Bundle savedInstanceState) {
  16. super.onCreate(savedInstanceState);
  17. setContentView(R.layout.activity_main);
  18. initPager();
  19. initTabView();
  20. }
  21. private void initTabView() {
  22. ll_chat=findViewById(R.id.ll_chat);
  23. ll_chat.setOnClickListener(this);
  24. ll_contact=findViewById(R.id.ll_contact);
  25. ll_contact.setOnClickListener(this);
  26. ll_find=findViewById(R.id.ll_find);
  27. ll_find.setOnClickListener(this);
  28. ll_me=findViewById(R.id.ll_me);
  29. ll_me.setOnClickListener(this);
  30. iv_chat=findViewById(R.id.iv_chat);
  31. iv_contact=findViewById(R.id.iv_contact);
  32. iv_find=findViewById(R.id.iv_find);
  33. iv_me=findViewById(R.id.iv_me);
  34. iv_chat.setSelected(true);
  35. iv_current=iv_chat;
  36. }
  37. private void initPager() {
  38. viewpager = findViewById(R.id.vp_item);
  39. ArrayList<Fragment> fragments=new ArrayList<>();
  40. fragments.add(BlankFragment.newInstance("微信聊天"));
  41. fragments.add(BlankFragment.newInstance("通讯录"));
  42. fragments.add(BlankFragment.newInstance("发现"));
  43. fragments.add(BlankFragment.newInstance("我"));
  44. MyFragmentPagerAdapter myFragmentPagerAdapter = new MyFragmentPagerAdapter
  45. (getSupportFragmentManager(),getLifecycle(),fragments);
  46. viewpager.setAdapter(myFragmentPagerAdapter);
  47. viewpager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
  48. @Override
  49. public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
  50. super.onPageScrolled(position, positionOffset, positionOffsetPixels);
  51. }
  52. @Override
  53. public void onPageSelected(int position) {
  54. super.onPageSelected(position);
  55. changeTab(position);
  56. }
  57. @Override
  58. public void onPageScrollStateChanged(int state) {
  59. super.onPageScrollStateChanged(state);
  60. }
  61. });
  62. }
  63. private void changeTab(int position) {
  64. iv_current.setSelected(false);
  65. switch (position){
  66. case R.id.ll_chat:
  67. viewpager.setCurrentItem(0);
  68. case 0:
  69. iv_chat.setSelected(true);
  70. iv_current=iv_chat;
  71. break;
  72. case R.id.ll_contact:
  73. viewpager.setCurrentItem(1);
  74. case 1:
  75. iv_contact.setSelected(true);
  76. iv_current=iv_contact;
  77. break;
  78. case R.id.ll_find:
  79. viewpager.setCurrentItem(2);
  80. case 2:
  81. iv_find.setSelected(true);
  82. iv_current=iv_find;
  83. break;
  84. case R.id.ll_me:
  85. viewpager.setCurrentItem(3);
  86. case 3:
  87. iv_me.setSelected(true);
  88. iv_current=iv_me;
  89. break;
  90. }
  91. }
  92. @Override
  93. public void onClick(View v) {
  94. changeTab(v.getId());
  95. }
  96. }

6.BlankFragment文件代码

  1. package com.example.wechatpage;
  2. import android.content.Context;
  3. import android.net.Uri;
  4. import android.os.Bundle;
  5. import androidx.fragment.app.Fragment;
  6. import android.view.LayoutInflater;
  7. import android.view.View;
  8. import android.view.ViewGroup;
  9. import android.widget.TextView;
  10. public class BlankFragment extends Fragment {
  11. private static final String ARG_TEXT= "param1";
  12. // TODO: Rename and change types of parameters
  13. private String mTextString;
  14. View rootView;
  15. public BlankFragment() {
  16. // Required empty public constructor
  17. }
  18. // TODO: Rename and change types and number of parameters
  19. public static BlankFragment newInstance(String param1) {
  20. BlankFragment fragment = new BlankFragment();
  21. Bundle args = new Bundle();
  22. args.putString(ARG_TEXT, param1);
  23. fragment.setArguments(args);
  24. return fragment;
  25. }
  26. @Override
  27. public void onCreate(Bundle savedInstanceState) {
  28. super.onCreate(savedInstanceState);
  29. if (getArguments() != null) {
  30. mTextString = getArguments().getString(ARG_TEXT);
  31. }
  32. }
  33. @Override
  34. public View onCreateView(LayoutInflater inflater, ViewGroup container,
  35. Bundle savedInstanceState) {
  36. if (rootView==null) {
  37. rootView = inflater.inflate(R.layout.fragment_blank, container, false);
  38. }
  39. initView();
  40. return rootView;
  41. }
  42. private void initView() {
  43. TextView textView = rootView.findViewById(R.id.tv_item);
  44. textView.setText(mTextString);
  45. }
  46. }

7.MyFragmentPagerAdapter文件代码

  1. package com.example.wechatpage;
  2. import androidx.annotation.NonNull;
  3. import androidx.fragment.app.Fragment;
  4. import androidx.fragment.app.FragmentManager;
  5. import androidx.lifecycle.Lifecycle;
  6. import androidx.viewpager2.adapter.FragmentStateAdapter;
  7. import java.util.ArrayList;
  8. import java.util.List;
  9. public class MyFragmentPagerAdapter extends FragmentStateAdapter {
  10. List<Fragment> fragmentList;
  11. public MyFragmentPagerAdapter(@NonNull FragmentManager fragmentManager,
  12. @NonNull Lifecycle lifecycle,List<Fragment> fragmentList) {
  13. super(fragmentManager, lifecycle);
  14. this.fragmentList=fragmentList;
  15. }
  16. @NonNull
  17. @Override
  18. public Fragment createFragment(int position) {
  19. return fragmentList.get(position);
  20. }
  21. @Override
  22. public int getItemCount() {
  23. return fragmentList.size();
  24. }
  25. }

8.效果图:

image.png
image.png
image.png
image.png