目錄
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)!專注于網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、微信小程序開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了石首免費(fèi)建站歡迎大家使用!1 初級版
1.1?XML布局文件添加ViewPager
1.2 Java代碼創(chuàng)建Adapter類
1.2.1 重寫方法getItem
1.2.2 重寫方法getCount
1.2.3 適配器構(gòu)造器
1.3 創(chuàng)建Fragment
1.4 Java主代碼
1.4.1 數(shù)據(jù)源添加數(shù)據(jù)
1.4.2實例化適配器
1.4.3給ViewPager添加適配器
1.4.4 給ViewPager添加監(jiān)聽事件
2 中級版?
2.1 XML布局文件添加ViewPager
2.2 Java代碼創(chuàng)建Adapter類
2.3?重寫FragmentPagerAdapter的兩個方法
2.4 創(chuàng)建Fragment
2.5 Java主代碼
2.5.1 數(shù)據(jù)源添加數(shù)據(jù)
2.5.2 實例化適配器
2.5.3 給ViewPager添加適配器
2.6?ViewPager和底部導(dǎo)航欄的聯(lián)動
3 高級版
3.1 ViewPager用法
3.2?FragmentPagerAdapter用法
3.3?ButtonNavigationView用法
3.4?ViewPager切換頁面和ButtonNavigationView的聯(lián)動
3.4.1?ViewPager聯(lián)動ButtonNavigationView
3.4.2?ButtonNavigationView聯(lián)動ViewPager
3.4.3?Badge用法(新消息提示)
3.5
3.6 創(chuàng)建菜單menu
3.7?XML布局文件添加ViewPager和ButtonNavigationView
3.8 Java主代碼獲取控件
3.9?Java代碼創(chuàng)建Adapter類
3.10 重寫FragmentPagerAdapter的兩個方法
3.11 適配器構(gòu)造器
3.12 創(chuàng)建Fragment
3.12.1 XML文件
3.12.2 Java文件
3.13 Java主代碼
3.13.1 數(shù)據(jù)源添加數(shù)據(jù)
3.13.2 實例化適配器
3.13.3 給ViewPager添加適配器
3.13.4 給ViewPager添加監(jiān)聽事件
3.13.5?給ButtonNavigationView添加監(jiān)聽事件
3.14 Badge的設(shè)置
3.14.1 Badge的添加
3.14.2 Badge的移除
最后,上Activity的主代碼~
ViewPager通過滑動來切換Fragment,無底部導(dǎo)航欄。
用法:數(shù)據(jù)List
通過FragmentPagerAdapter連接兩者的橋梁,里面需要重寫兩個方法getItem,getCount。
第一個方法是獲取一個Fragment,從數(shù)據(jù)源獲取。
第二個方法是獲取數(shù)據(jù)源的大小,也就是有幾頁。
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獲取數(shù)據(jù)源的位置
public Fragment getItem(int position){
return mFragmentList==null?null:mFragmentList.get(position);
}
1.2.2 重寫方法getCount獲取數(shù)據(jù)源的個數(shù)
public int getCount(){
return mFragmentList==null?0:mFragmentList.size();
}
1.2.3 適配器構(gòu)造器需要傳入一個FragmentManager對象和數(shù)據(jù)源。
也是只有一個文本TextView,new的時候傳入一個參數(shù)來更改文本。
聲明數(shù)據(jù)源List
實例化Fragment,用newInstance()。并add到List中。
1.4.2實例化適配器傳入兩個參數(shù),getSupportFragmentManager()即可獲取FragmentManager對象,數(shù)據(jù)源。
1.4.3給ViewPager添加適配器setAdapter即可。
1.4.4 給ViewPager添加監(jiān)聽事件addOnPageChangeListener(),其中可以設(shè)置比如讓底部導(dǎo)航欄變色。
ViewPager通過滑動來切換Fragment,有普通的底部導(dǎo)航欄,故也可以通過底部導(dǎo)航欄切換fragment。
用法:ViewPager+FragmentPagerAdapter+普通ButtonView
ViewPager用法+FragmentPagerAdapter的用法+ViewPager和底部導(dǎo)航欄的聯(lián)動
就是要寫很多控件,還要找,比較麻煩。
2.1 XML布局文件添加ViewPager在Activity的XML布局文件中添加一個控件——ViewPager。
加入寬高和ID即可。
在Java代碼中找控件ViewPager。
繼承自FragmentPagerAdapter類,重寫兩個方法getItem,getCount。
同上1.2。
也是只有一個文本TextView,new的時候傳入一個參數(shù)來更改文本。
聲明數(shù)據(jù)源List
實例化Fragment,用newInstance()。并add到List中。
2.5.2 實例化適配器傳入兩個參數(shù),getSupportFragmentManager()即可獲取FragmentManager對象,數(shù)據(jù)源。
2.5.3 給ViewPager添加適配器setAdapter即可。
當(dāng)切換頁面的時候,把底部導(dǎo)航相應(yīng)的狀態(tài)給改變一下。通過ViewPager的addOnPageChangeListener的三個回調(diào)。
當(dāng)點擊底部導(dǎo)航時,把Fragment的頁面給切換一下。通過線性布局的按鈕點擊事件的回調(diào)。
ViewPager通過滑動來切換Fragment,底部導(dǎo)航欄換成了ButtonNavigationView,故也可以通過底部導(dǎo)航欄切換fragment。
就是在中級版的基礎(chǔ)上,把普通按鈕換成了另外一個控件ButtonNavigationView,這個控件更加方便。
用法:ViewPager+FragmentPagerAdapter+ButtonNavigationView實現(xiàn)底部導(dǎo)航頁
ViewPager用法+FragmentPagerAdapter用法+ButtonNavigationView用法+ViewPager切換頁面和ButtonNavigationView的聯(lián)動+Badge用法(新消息提示)。
3.1 ViewPager用法數(shù)據(jù)List<>+適配器FragmentPagerAdapter+ViewPager
繼承自FragmentPagerAdapter類,重寫兩個方法getItem,getCount。
同上1.2。
有兩個重要的屬性app:menu(聲明導(dǎo)航按鈕)和app:labelVisibility(導(dǎo)航按鈕的顯示模式,有4個值可選)
labeled(一直顯示文字),unlabeled(不顯示文字),selected(選中顯示文字),auto(自動:小于三個按鈕取labeled;大于三個按鈕取selected)。
當(dāng)ViewPager發(fā)生變化時,底部按鈕要發(fā)生變化
mViewPager.addOnPageChangeListener(...)
mBottomNavigationView.setSelectedItemId(R.id.menu_xxx)
3.4.2?ButtonNavigationView聯(lián)動ViewPager當(dāng)點擊按鈕時,ViewPager要發(fā)生變化
mBottomNavigationView.setOnItemSelectedListener(...)
mViewPager.setCurrentItem(index)
3.4.3?Badge用法(新消息提示)創(chuàng)建Badge
//新消息加到菜單中哪個icon中,注冊
BadgeDrawable badge=mBottomNavigationView.getOrCreateBadge(R.id.menu_xxx);
設(shè)置消息數(shù)
//默認(rèn)是4個字符,只能999+
badge.setNumber(949);
//代表只能容下3個字符,99+
//若是4,則是999+
badge.setMaxCharacterCount(3);
到達(dá)頁面移除badge
mBottomNavigationView.removeBadge(R.id.menu_xxx);
開始寫代碼咯!?
3.5 3.6 創(chuàng)建菜單menu之前的博客有寫,直接創(chuàng)建選項菜單即可。可以在icon選取一個selected選擇器,有按下和不按的兩種圖標(biāo)狀態(tài)。我這里沒有設(shè)置選擇器,只有一個icon而已。
3.7?XML布局文件添加ViewPager和ButtonNavigationView最基礎(chǔ)的是設(shè)置寬高和Id,如果沒有ButtonNavigationView控件,可能是沒有導(dǎo)入依賴"com.google.android.material:material:1.2.1"。
ViewPager額外設(shè)置權(quán)重weight屬性。
ButtonNavigationView額外設(shè)置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代碼創(chuàng)建Adapter類繼承自FragmentStatePagerAdapter類,這個類會回收劃掉的頁面,而前面那個FragmentPagerAdapter不會回收,會在后臺占據(jù)著內(nèi)存,使用方面是一樣的。
3.10 重寫FragmentPagerAdapter的兩個方法重寫getItem,getCount。同上1.2。
3.11 適配器構(gòu)造器設(shè)置一個傳入FragmentManager對象和數(shù)據(jù)源的構(gòu)造器。
也是只有一個文本TextView,new的時候傳入一個參數(shù)來更改文本。
3.12.2 Java文件通過傳入?yún)?shù)來更改文本
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);
}
}
}
聲明數(shù)據(jù)源List
Listlist=new ArrayList<>();
3.13.1 數(shù)據(jù)源添加數(shù)據(jù)實例化Fragment,用newInstance()。并add到List中。
private void initData() {
viewPagerFragment viewPagerFragmenthome=viewPagerFragment.newInstance("首頁","");
viewPagerFragment viewPagerFragmentfind=viewPagerFragment.newInstance("發(fā)現(xiàn)","");
viewPagerFragment viewPagerFragmentmine=viewPagerFragment.newInstance("我的","");
list.add(viewPagerFragmenthome);
list.add(viewPagerFragmentfind);
list.add(viewPagerFragmentmine);
}
3.13.2 實例化適配器傳入兩個參數(shù),getSupportFragmentManager()即可獲取FragmentManager對象,數(shù)據(jù)源。
myFragmentVPAdapter = new MyFragmentVPAdapter(getSupportFragmentManager(), list);
3.13.3 給ViewPager添加適配器setAdapter即可。
viewPager.setAdapter(myFragmentVPAdapter);
3.13.4 給ViewPager添加監(jiān)聽事件addOnPageChangeListener(),其中可以設(shè)置比如讓底部導(dǎo)航欄變色。
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) {
}
});
寫在第二個回調(diào)onPageSelected(),然后設(shè)置某個icon被選中即可,不需要再取消其他icon的選中狀態(tài),這個控件選中其中一個,另外的icon就會被取消,這就是ButtonNavigationView的好處。
3.13.5?給ButtonNavigationView添加監(jiān)聽事件mBottomNavigationView.setOnItemSelectedListener(),可以讓ViewPager切換頁面。
//舊方法,已經(jīng)廢棄
mBottomNavigationView.setOnItemSelectedListener(...)
//設(shè)置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的設(shè)置
3.14.1 Badge的添加BadgeDrawable badgeDrawable=mBottomNavigationView.getOrCreateBadge(R.id.like);
badgeDrawable.setNumber(888);
badgeDrawable.setMaxCharacterCount(3);
3.14.2 Badge的移除在ViewPager的頁面監(jiān)聽事件中獲取信息,如果到達(dá)這個頁面的話就移除。
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("發(fā)現(xiàn)","");
viewPagerFragment viewPagerFragmentmine=viewPagerFragment.newInstance("我的","");
list.add(viewPagerFragmenthome);
list.add(viewPagerFragmentfind);
list.add(viewPagerFragmentmine);
}
}
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧