目錄
1 初級版
1.1?XML布局文件添加ViewPager
1.2 Java代碼創建Adapter類
1.2.1 重寫方法getItem
1.2.2 重寫方法getCount
1.2.3 適配器構造器
1.3 創建Fragment
1.4 Java主代碼
1.4.1 數據源添加數據
1.4.2實例化適配器
1.4.3給ViewPager添加適配器
1.4.4 給ViewPager添加監聽事件
2 中級版?
2.1 XML布局文件添加ViewPager
2.2 Java代碼創建Adapter類
2.3?重寫FragmentPagerAdapter的兩個方法
2.4 創建Fragment
2.5 Java主代碼
2.5.1 數據源添加數據
2.5.2 實例化適配器
2.5.3 給ViewPager添加適配器
2.6?ViewPager和底部導航欄的聯動
3 高級版
3.1 ViewPager用法
3.2?FragmentPagerAdapter用法
3.3?ButtonNavigationView用法
3.4?ViewPager切換頁面和ButtonNavigationView的聯動
3.4.1?ViewPager聯動ButtonNavigationView
3.4.2?ButtonNavigationView聯動ViewPager
3.4.3?Badge用法(新消息提示)
3.5
3.6 創建菜單menu
3.7?XML布局文件添加ViewPager和ButtonNavigationView
3.8 Java主代碼獲取控件
3.9?Java代碼創建Adapter類
3.10 重寫FragmentPagerAdapter的兩個方法
3.11 適配器構造器
3.12 創建Fragment
3.12.1 XML文件
3.12.2 Java文件
3.13 Java主代碼
3.13.1 數據源添加數據
3.13.2 實例化適配器
3.13.3 給ViewPager添加適配器
3.13.4 給ViewPager添加監聽事件
3.13.5?給ButtonNavigationView添加監聽事件
3.14 Badge的設置
3.14.1 Badge的添加
3.14.2 Badge的移除
最后,上Activity的主代碼~
ViewPager通過滑動來切換Fragment,無底部導航欄。
用法:數據List
通過FragmentPagerAdapter連接兩者的橋梁,里面需要重寫兩個方法getItem,getCount。
第一個方法是獲取一個Fragment,從數據源獲取。
第二個方法是獲取數據源的大小,也就是有幾頁。
1.1?XML布局文件添加ViewPager在Activity的XML布局文件中添加一個控件——ViewPager。
加入寬高和ID即可。
在Java代碼中找控件ViewPager。
繼承自FragmentPagerAdapter類,重寫兩個方法getItem,getCount。
public class MyFragmentVPAdapter extends FragmentPagerAdapter {
private ListfragmentList;
public MyFragmentVPAdapter(@NonNull FragmentManager fm,Listlist) {
super(fm);
this.fragmentList=list;
}
@NonNull
@Override
public Fragment getItem(int position) {
return fragmentList==null?null:fragmentList.get(position);
}
@Override
public int getCount() {
return fragmentList==null?0:fragmentList.size();
}
}
1.2.1 重寫方法getItem獲取數據源的位置
public Fragment getItem(int position){
return mFragmentList==null?null:mFragmentList.get(position);
}
1.2.2 重寫方法getCount獲取數據源的個數
public int getCount(){
return mFragmentList==null?0:mFragmentList.size();
}
1.2.3 適配器構造器需要傳入一個FragmentManager對象和數據源。
也是只有一個文本TextView,new的時候傳入一個參數來更改文本。
聲明數據源List
實例化Fragment,用newInstance()。并add到List中。
1.4.2實例化適配器傳入兩個參數,getSupportFragmentManager()即可獲取FragmentManager對象,數據源。
1.4.3給ViewPager添加適配器setAdapter即可。
1.4.4 給ViewPager添加監聽事件addOnPageChangeListener(),其中可以設置比如讓底部導航欄變色。
ViewPager通過滑動來切換Fragment,有普通的底部導航欄,故也可以通過底部導航欄切換fragment。
用法:ViewPager+FragmentPagerAdapter+普通ButtonView
ViewPager用法+FragmentPagerAdapter的用法+ViewPager和底部導航欄的聯動
就是要寫很多控件,還要找,比較麻煩。
2.1 XML布局文件添加ViewPager在Activity的XML布局文件中添加一個控件——ViewPager。
加入寬高和ID即可。
在Java代碼中找控件ViewPager。
繼承自FragmentPagerAdapter類,重寫兩個方法getItem,getCount。
同上1.2。
也是只有一個文本TextView,new的時候傳入一個參數來更改文本。
聲明數據源List
實例化Fragment,用newInstance()。并add到List中。
2.5.2 實例化適配器傳入兩個參數,getSupportFragmentManager()即可獲取FragmentManager對象,數據源。
2.5.3 給ViewPager添加適配器setAdapter即可。
當切換頁面的時候,把底部導航相應的狀態給改變一下。通過ViewPager的addOnPageChangeListener的三個回調。
當點擊底部導航時,把Fragment的頁面給切換一下。通過線性布局的按鈕點擊事件的回調。
ViewPager通過滑動來切換Fragment,底部導航欄換成了ButtonNavigationView,故也可以通過底部導航欄切換fragment。
就是在中級版的基礎上,把普通按鈕換成了另外一個控件ButtonNavigationView,這個控件更加方便。
用法:ViewPager+FragmentPagerAdapter+ButtonNavigationView實現底部導航頁
ViewPager用法+FragmentPagerAdapter用法+ButtonNavigationView用法+ViewPager切換頁面和ButtonNavigationView的聯動+Badge用法(新消息提示)。
3.1 ViewPager用法數據List<>+適配器FragmentPagerAdapter+ViewPager
繼承自FragmentPagerAdapter類,重寫兩個方法getItem,getCount。
同上1.2。
有兩個重要的屬性app:menu(聲明導航按鈕)和app:labelVisibility(導航按鈕的顯示模式,有4個值可選)
labeled(一直顯示文字),unlabeled(不顯示文字),selected(選中顯示文字),auto(自動:小于三個按鈕取labeled;大于三個按鈕取selected)。
當ViewPager發生變化時,底部按鈕要發生變化
mViewPager.addOnPageChangeListener(...)
mBottomNavigationView.setSelectedItemId(R.id.menu_xxx)
3.4.2?ButtonNavigationView聯動ViewPager當點擊按鈕時,ViewPager要發生變化
mBottomNavigationView.setOnItemSelectedListener(...)
mViewPager.setCurrentItem(index)
3.4.3?Badge用法(新消息提示)創建Badge
//新消息加到菜單中哪個icon中,注冊
BadgeDrawable badge=mBottomNavigationView.getOrCreateBadge(R.id.menu_xxx);
設置消息數
//默認是4個字符,只能999+
badge.setNumber(949);
//代表只能容下3個字符,99+
//若是4,則是999+
badge.setMaxCharacterCount(3);
到達頁面移除badge
mBottomNavigationView.removeBadge(R.id.menu_xxx);
開始寫代碼咯!?
3.5 3.6 創建菜單menu之前的博客有寫,直接創建選項菜單即可。可以在icon選取一個selected選擇器,有按下和不按的兩種圖標狀態。我這里沒有設置選擇器,只有一個icon而已。
3.7?XML布局文件添加ViewPager和ButtonNavigationView最基礎的是設置寬高和Id,如果沒有ButtonNavigationView控件,可能是沒有導入依賴"com.google.android.material:material:1.2.1"。
ViewPager額外設置權重weight屬性。
ButtonNavigationView額外設置app:menu和app:labelVisibility。
3.8 Java主代碼獲取控件找兩個控件即可。
public class MainActivity extends AppCompatActivity {
private ViewPager viewPager;
private BottomNavigationView mBottomNavigationView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mBottomNavigationView = findViewById(R.id.btm_nav);
viewPager = findViewById(R.id.vp);
}
}
3.9?Java代碼創建Adapter類繼承自FragmentStatePagerAdapter類,這個類會回收劃掉的頁面,而前面那個FragmentPagerAdapter不會回收,會在后臺占據著內存,使用方面是一樣的。
3.10 重寫FragmentPagerAdapter的兩個方法重寫getItem,getCount。同上1.2。
3.11 適配器構造器設置一個傳入FragmentManager對象和數據源的構造器。
也是只有一個文本TextView,new的時候傳入一個參數來更改文本。
3.12.2 Java文件通過傳入參數來更改文本
public class viewPagerFragment extends Fragment {
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
private String mParam1;
private String mParam2;
private TextView textView;
public viewPagerFragment() {
}
public static viewPagerFragment newInstance(String param1, String param2) {
viewPagerFragment fragment = new viewPagerFragment();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_view_pager, container, false);
}
@Override
public void onViewCreated(@NonNull View view,
@Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
textView= view.findViewById(R.id.tv_1);
if(TextUtils.isEmpty(mParam1)){
textView.setText(mParam1);
}
}
}
聲明數據源List
Listlist=new ArrayList<>();
3.13.1 數據源添加數據實例化Fragment,用newInstance()。并add到List中。
private void initData() {
viewPagerFragment viewPagerFragmenthome=viewPagerFragment.newInstance("首頁","");
viewPagerFragment viewPagerFragmentfind=viewPagerFragment.newInstance("發現","");
viewPagerFragment viewPagerFragmentmine=viewPagerFragment.newInstance("我的","");
list.add(viewPagerFragmenthome);
list.add(viewPagerFragmentfind);
list.add(viewPagerFragmentmine);
}
3.13.2 實例化適配器傳入兩個參數,getSupportFragmentManager()即可獲取FragmentManager對象,數據源。
myFragmentVPAdapter = new MyFragmentVPAdapter(getSupportFragmentManager(), list);
3.13.3 給ViewPager添加適配器setAdapter即可。
viewPager.setAdapter(myFragmentVPAdapter);
3.13.4 給ViewPager添加監聽事件addOnPageChangeListener(),其中可以設置比如讓底部導航欄變色。
mViewPager.addOnPageChangeListener(...)
mBottomNavigationView.setSelectedItemId(R.id.menu_xxx)
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
switch(position){
case 0:
mBottomNavigationView.setSelectedItemId(R.id.like);
break;
case 1:
mBottomNavigationView.setSelectedItemId(R.id.local);
break;
case 2:
mBottomNavigationView.setSelectedItemId(R.id.report);
break;
case 3:
mBottomNavigationView.setSelectedItemId(R.id.share);
break;
}
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
寫在第二個回調onPageSelected(),然后設置某個icon被選中即可,不需要再取消其他icon的選中狀態,這個控件選中其中一個,另外的icon就會被取消,這就是ButtonNavigationView的好處。
3.13.5?給ButtonNavigationView添加監聽事件mBottomNavigationView.setOnItemSelectedListener(),可以讓ViewPager切換頁面。
//舊方法,已經廢棄
mBottomNavigationView.setOnItemSelectedListener(...)
//設置ViewPager
mViewPager.setCurrentItem(index)
//我們這里不用廢棄的舊方法,用setOnItemSelectedListener
mBottomNavigationView.setOnItemSelectedListener(new NavigationBarView.OnItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch(item.getItemId()){
case R.id.like:
viewPager.setCurrentItem(0);
break;
case R.id.local:
viewPager.setCurrentItem(1);
break;
case R.id.report:
viewPager.setCurrentItem(2);
break;
case R.id.share:
viewPager.setCurrentItem(3);
break;
default:
break;
}
return true;
}
});
3.14 Badge的設置
3.14.1 Badge的添加BadgeDrawable badgeDrawable=mBottomNavigationView.getOrCreateBadge(R.id.like);
badgeDrawable.setNumber(888);
badgeDrawable.setMaxCharacterCount(3);
3.14.2 Badge的移除在ViewPager的頁面監聽事件中獲取信息,如果到達這個頁面的話就移除。
mBottomNavigationView.removeBadge(R.id.like);
最后,上Activity的主代碼~package com.example.fragmentviewpager;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.viewpager.widget.ViewPager;
import android.os.Bundle;
import android.view.MenuItem;
import android.view.View;
import com.google.android.material.badge.BadgeDrawable;
import com.google.android.material.bottomnavigation.BottomNavigationView;
import com.google.android.material.navigation.NavigationBarView;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private ViewPager viewPager;
private BottomNavigationView mBottomNavigationView;
private MyFragmentVPAdapter myFragmentVPAdapter;
Listlist=new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mBottomNavigationView = findViewById(R.id.btm_nav);
viewPager = findViewById(R.id.vp);
initData();
myFragmentVPAdapter = new MyFragmentVPAdapter(getSupportFragmentManager(), list);
viewPager.setAdapter(myFragmentVPAdapter);
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
switch(position){
case 0:
mBottomNavigationView.removeBadge(R.id.like);
mBottomNavigationView.setSelectedItemId(R.id.like);
break;
case 1:
mBottomNavigationView.setSelectedItemId(R.id.local);
break;
case 2:
mBottomNavigationView.setSelectedItemId(R.id.report);
break;
case 3:
mBottomNavigationView.setSelectedItemId(R.id.share);
break;
}
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
mBottomNavigationView.setOnItemSelectedListener(new NavigationBarView.OnItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch(item.getItemId()){
case R.id.like:
viewPager.setCurrentItem(0);
break;
case R.id.local:
viewPager.setCurrentItem(1);
break;
case R.id.report:
viewPager.setCurrentItem(2);
break;
case R.id.share:
viewPager.setCurrentItem(3);
break;
default:
break;
}
return true;
}
});
BadgeDrawable badgeDrawable=mBottomNavigationView.getOrCreateBadge(R.id.like);
badgeDrawable.setNumber(888);
badgeDrawable.setMaxCharacterCount(3);
}
private void initData() {
viewPagerFragment viewPagerFragmenthome=viewPagerFragment.newInstance("首頁","");
viewPagerFragment viewPagerFragmentfind=viewPagerFragment.newInstance("發現","");
viewPagerFragment viewPagerFragmentmine=viewPagerFragment.newInstance("我的","");
list.add(viewPagerFragmenthome);
list.add(viewPagerFragmentfind);
list.add(viewPagerFragmentmine);
}
}
你是否還在尋找穩定的海外服務器提供商?創新互聯www.cdcxhl.cn海外機房具備T級流量清洗系統配攻擊溯源,準確流量調度確保服務器高可用性,企業級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧
網頁題目:ViewPager和Fragment使用(附源碼)-創新互聯
瀏覽地址:http://vcdvsql.cn/article6/dehcig.html
成都網站建設公司_創新互聯,為您提供微信公眾號、標簽優化、網站內鏈、靜態網站、ChatGPT、網站改版
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯