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