成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

ViewPager和Fragment使用(附源碼)-創(chuàng)新互聯(lián)

目錄

網(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的主代碼~


1 初級(jí)版

ViewPager通過(guò)滑動(dòng)來(lái)切換Fragment,無(wú)底部導(dǎo)航欄。

用法:數(shù)據(jù)List+適配器FragmentPagerAdapter+ViewPager

通過(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。


1.2 Java代碼創(chuàng)建Adapter類

繼承自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ù)源。


1.3 創(chuàng)建Fragment

也是只有一個(gè)文本TextView,new的時(shí)候傳入一個(gè)參數(shù)來(lái)更改文本。


1.4 Java主代碼

聲明數(shù)據(jù)源List,實(shí)例化適配器。

1.4.1 數(shù)據(jù)源添加數(shù)據(jù)

實(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)航欄變色。


2 中級(jí)版?

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。


2.2 Java代碼創(chuàng)建Adapter類

繼承自FragmentPagerAdapter類,重寫兩個(gè)方法getItem,getCount。


2.3?重寫FragmentPagerAdapter的兩個(gè)方法

同上1.2。


2.4 創(chuàng)建Fragment

也是只有一個(gè)文本TextView,new的時(shí)候傳入一個(gè)參數(shù)來(lái)更改文本。


2.5 Java主代碼

聲明數(shù)據(jù)源List,實(shí)例化適配器。

2.5.1 數(shù)據(jù)源添加數(shù)據(jù)

實(shí)例化Fragment,用newInstance()。并add到List中。

2.5.2 實(shí)例化適配器

傳入兩個(gè)參數(shù),getSupportFragmentManager()即可獲取FragmentManager對(duì)象,數(shù)據(jù)源。

2.5.3 給ViewPager添加適配器

setAdapter即可。


2.6?ViewPager和底部導(dǎo)航欄的聯(lián)動(dòng)

當(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)。


3 高級(jí)版

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


3.2?FragmentPagerAdapter用法

繼承自FragmentPagerAdapter類,重寫兩個(gè)方法getItem,getCount。

同上1.2。


3.3?ButtonNavigationView用法

有兩個(gè)重要的屬性app:menu(聲明導(dǎo)航按鈕)和app:labelVisibility(導(dǎo)航按鈕的顯示模式,有4個(gè)值可選)

labeled(一直顯示文字),unlabeled(不顯示文字),selected(選中顯示文字),auto(自動(dòng):小于三個(gè)按鈕取labeled;大于三個(gè)按鈕取selected)。


3.4?ViewPager切換頁(yè)面和ButtonNavigationView的聯(lián)動(dòng) 3.4.1?ViewPager聯(lián)動(dòng)ButtonNavigationView

當(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)造器。


3.12 創(chuàng)建Fragment 3.12.1 XML文件

也是只有一個(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);
        }
    }
}

3.13 Java主代碼

聲明數(shù)據(jù)源List,實(shí)例化適配器。

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)

微信小程序開(kāi)發(fā)
寿光市| 屏山县| 东丰县| 泸定县| 全州县| 台前县| 中山市| 信宜市| 光山县| 扬中市| 灯塔市| 威宁| 开化县| 墨脱县| 禹州市| 泰兴市| 敦化市| 孟村| 涪陵区| 固镇县| 教育| 中江县| 阿尔山市| 阿尔山市| 简阳市| 门源| 曲沃县| 全州县| 博客| 缙云县| 石阡县| 台中市| 凌海市| 调兵山市| 云南省| 安龙县| 金平| 刚察县| 河西区| 酉阳| 荃湾区|