国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

android 關于TabLayout聯(lián)動ViewPager2 實現(xiàn)底部導航欄

這篇具有很好參考價值的文章主要介紹了android 關于TabLayout聯(lián)動ViewPager2 實現(xiàn)底部導航欄。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

最近在心血來潮想寫在app 不過我關于android可以說是0基礎 在寫底部導航欄的時候去問了大佬才知道TabLayout和ViewPager 花了兩天才看懂...

這里只是簡單介紹因為我不準備專門做安卓軟件所以在學的途中很多地方?jīng)]有認真記

介紹

本篇文章使用的代碼是Java

這里官方是有將兩個進行聯(lián)動的方法的 當然如果不用也可以做 只不過應該沒人會這樣寫...

TabLayout

關于TabLayout給我的第一感覺是真的強大 而大部分情況TabLayout都是用于做導航欄的(也是暫時沒想出來還可以做什么)

ViewPager

而ViewPager主要是用于做頁面滾動 滑動頁面 等

這里頁面滾動和滑動頁面是兩個東西 頁面滾動就是類似于在瀏覽某寶或新聞網(wǎng)站時遇到的滾動效果 頁面滑動是用戶用手指滑動頁面(左滑或右滑) 而這里的滾動是自動的由程序設置定時器的方式滾動 當然也可以手動滑動 頁面滑動只是用戶用手指去滑動

代碼

layout_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/father_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/white"
    tools:context=".Main">

    <androidx.viewpager2.widget.ViewPager2
        android:id="@+id/view_pager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

    <com.google.android.material.tabs.TabLayout
        android:id="@+id/navigation"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        app:tabGravity="fill"
        app:tabIconTint="@color/tab_layout"
        app:tabIndicatorFullWidth="true"
        app:tabIndicatorGravity="top"
        app:tabIndicatorHeight="2dp"
        app:tabMode="fixed"
        app:tabRippleColor="#ADD8E6"
        app:tabUnboundedRipple="true"/>

</RelativeLayout>

可以看到在我的layout_main文件里我定義TabLayout與ViewPager2

需要注意的是這里的ViewPager2和ViewPager是有區(qū)別的 一會介紹

由于我沒記住TabLayout的屬性所以就放文章給大家了....

TabLayout屬性介紹:TabLayout屬性介紹

Main.java

package com.javabot.demo;

import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;

import android.widget.ImageView;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.Fragment;
import androidx.viewpager2.widget.ViewPager2;

import com.daimajia.androidanimations.library.Techniques;
import com.daimajia.androidanimations.library.YoYo;
import com.google.android.material.tabs.TabLayout;
import com.google.android.material.tabs.TabLayoutMediator;
import com.javabot.demo.fragment.FragmentCommunity;
import com.javabot.demo.fragment.FragmentContact;
import com.javabot.demo.fragment.FragmentDocumentation;
import com.javabot.demo.fragment.FragmentHomePage;
import com.javabot.demo.utils.MyFragmentPagerAdapter;
import com.javabot.demo.utils.svg;

import java.util.ArrayList;
import java.util.List;

/**
 * 主程序
 *
 * @author 白
 */
public class Main extends AppCompatActivity {

    private final Context context = this;

    /**
     * 工具 svg對象
     */
    private final svg svg = new svg(context);

    private int[] tabIconView = {
            R.drawable.home,
            R.drawable.megaphone,
            R.drawable.paper_plane,
            R.drawable.user
    };

    /**
     * 自定義view
     *
     * @param icon svg
     * @return View
     */
    private View setCustomView(int icon) {
        View v = View.inflate(context, R.layout.custom_view, null);
        ImageView i = v.findViewById(R.id.CustomViewImage);
        i.setImageTintList(ContextCompat.getColorStateList(context, R.color.tab_layout));
        i.setImageDrawable(svg.svgImage(icon));
        return v;
    }

    /**
     * TabLayout關聯(lián)ViewPager2
     */
    private void addMyFragmentPagerAdapter() {
        List<Fragment> fragmentList = new ArrayList<>();

        FragmentHomePage homePage = new FragmentHomePage();
        FragmentCommunity community = new FragmentCommunity();
        FragmentContact contact = new FragmentContact();
        FragmentDocumentation documentation = new FragmentDocumentation(context);

        fragmentList.add(homePage);
        fragmentList.add(community);
        fragmentList.add(contact);
        fragmentList.add(documentation);

        MyFragmentPagerAdapter fragmentAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager(),getLifecycle(), fragmentList);
        TabLayout tabLayout = findViewById(R.id.navigation);
        ViewPager2 viewPager = findViewById(R.id.view_pager);
        viewPager.setAdapter(fragmentAdapter);

        new TabLayoutMediator(tabLayout, viewPager,
                (tab, position) -> {
                    tab.setIcon(tabIconView[position]);
                }
        ).attach();

        // 監(jiān)聽頁面切換事件
        viewPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
            @Override
            public void onPageSelected(int position) {
                // 更新TabLayout的選中狀態(tài)
                tabLayout.selectTab(tabLayout.getTabAt(position));
                tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
                    @Override
                    public void onTabSelected(TabLayout.Tab tab) {
                    }

                    @Override
                    public void onTabUnselected(TabLayout.Tab tab) {
                    }

                    @Override
                    public void onTabReselected(TabLayout.Tab tab) {
                        YoYo.with(Techniques.RubberBand)
                                .duration(700)
                                .playOn(tab.view);
                    }
                });
            }
        });
    }

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout_main);
        addMyFragmentPagerAdapter();
    }
}

主要關聯(lián)的代碼在addMyFragmentPagerAdapter方法中

這里我們將代碼一點點拆解介紹

addMyFragmentPagerAdapte方法

這里的代碼都是按照addMyFragmentPagerAdapte方法中的代碼一行一行的講解 所以看到不知道的變量時請往上瞅瞅

 List<Fragment> fragmentList = new ArrayList<>();

這里是創(chuàng)建視圖存儲器的 這個就看各位喜好了 也可以用Map或數(shù)組

ViewPager2的視圖對象需要是Fragment而不是View 因為適配器需要

關于ViewPager2的詳細介紹請移步

ViewPagers2

FragmentHomePage homePage = new FragmentHomePage();
FragmentCommunity community = new FragmentCommunity();
FragmentContact contact = new FragmentContact();
FragmentDocumentation documentation = new FragmentDocumentation(context);
fragmentList.add(homePage);
fragmentList.add(community);
fragmentList.add(contact);
fragmentList.add(documentation);

創(chuàng)建視圖對象并添加到集合中 這一步?jīng)]什么好說的 視圖對象會在下面放出來

MyFragmentPagerAdapter fragmentAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager(),getLifecycle(), fragmentList);

創(chuàng)建適配器對象 適配器會在下面放出來

TabLayout tabLayout = findViewById(R.id.navigation);
ViewPager2 viewPager = findViewById(R.id.view_pager);

獲取xml文件中的視圖id?這里也沒什么好說的

viewPager.setAdapter(fragmentAdapter);

設置ViewPager2適配器fragmentAdapter由適配器對象獲得

new TabLayoutMediator(tabLayout, viewPager,
        (tab, position) -> {
            tab.setIcon(tabIconView[position]);
    }).attach();

將TabLayout和ViewPager2關聯(lián)

而這里的

tab.setIcon(tabIconView[position]);

就是在里面的代碼是用于設置TabLayout顯示的內(nèi)容的 這邊這個可以自己按需求更改

// 監(jiān)聽頁面切換事件
        viewPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
            @Override
            public void onPageSelected(int position) {
                // 更新TabLayout的選中狀態(tài)
                tabLayout.selectTab(tabLayout.getTabAt(position));
                tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
                    @Override
                    public void onTabSelected(TabLayout.Tab tab) {
                    }

                    @Override
                    public void onTabUnselected(TabLayout.Tab tab) {
                    }

                    @Override
                    public void onTabReselected(TabLayout.Tab tab) {
                        YoYo.with(Techniques.RubberBand)
                                .duration(700)
                                .playOn(tab.view);
                    }
                });
            }
        });

這里就和備注的一樣 和平常的監(jiān)聽事件相同這里可寫可不寫

需要拿出來說的是

 YoYo.with(Techniques.RubberBand)
    .duration(700)
    .playOn(tab.view);

這是一個名叫悠悠球的動畫庫

這里是官網(wǎng)介紹:YoYo

依賴如下

//悠悠球動畫庫
implementation 'com.daimajia.androidanimations:library:2.4@aar'

適配器?FragmentStateAdapter對象

package com.javabot.demo.utils;

import static androidx.viewpager.widget.PagerAdapter.POSITION_NONE;

import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager;
import androidx.lifecycle.Lifecycle;
import androidx.viewpager2.adapter.FragmentStateAdapter;

import java.util.List;

/**
 * 適配器對象
 * @author 白
 */
public class MyFragmentPagerAdapter extends FragmentStateAdapter {
    private final List<Fragment> fragmentList;

    public MyFragmentPagerAdapter(@NonNull FragmentManager fragmentManager, @NonNull Lifecycle lifecycle, List<Fragment> fragmentList) {
        super(fragmentManager, lifecycle);
        this.fragmentList = fragmentList;
    }

    public MyFragmentPagerAdapter(FragmentActivity fm, List<Fragment> fragmentList) {
        super(fm);
        this.fragmentList=fragmentList;
    }

    @NonNull
    @Override
    public Fragment createFragment(int position) {
        return fragmentList.get(position);
    }

    @Override
    public int getItemCount() {
        return fragmentList.size();
    }

    @Override
    public long getItemId(int position) {
        return fragmentList.get(position).hashCode();
    }
}

這里的適配器你需要重寫的方法有getItemCount和createFragment

這里也只介紹這兩個方法

getItemCount方法

此方法返回的是視圖的個數(shù) 例如我想要顯示4個視圖那就返回4 如果我給適配器傳的視圖有6個或者更多但是這個方法只返回4那也只會顯示4個視圖

createFragment方法

這個方法返回的是視圖而此方法中的參數(shù)position 代表當前是哪個視圖 返回對應視圖的下標(從0開始)

例如我在這個方法中寫if判斷 position==0 再返回某個視圖對象 那他的意思其實就是當用戶點擊到下標為0的那個選項時(或滑動)當前視圖顯示的內(nèi)容就是我這里所返回的視圖內(nèi)容

視圖文件?Fragment對象

package com.javabot.demo.fragment;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;

import com.javabot.demo.R;

/**
 * 主頁視圖
 */
public class FragmentHomePage extends Fragment {
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.home_page,container,false);
    }
}

剩下的和這個一樣就不發(fā)出來了

和視圖文件所對應的xml文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
<TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="主頁"/>

</RelativeLayout>

這里都差不多就不放出來了

效果圖

tablayout和viewpager2,android,學習

?文章來源地址http://www.zghlxwxcb.cn/news/detail-822719.html

?

到了這里,關于android 關于TabLayout聯(lián)動ViewPager2 實現(xiàn)底部導航欄的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • Android修行手冊 - 使用ViewPager2實現(xiàn)畫廊效果

    Android修行手冊 - 使用ViewPager2實現(xiàn)畫廊效果

    Unity3D特效百例 案例項目實戰(zhàn)源碼 Android-Unity實戰(zhàn)問題匯總 游戲腳本-輔助自動化 Android控件全解手冊 再戰(zhàn)Android系列 Scratch編程案例 軟考全系列 Unity3D學習專欄 藍橋系列 ChatGPT和AIGC 專注于 Android/Unity 和各種游戲開發(fā)技巧,以及 各種資源分享 (網(wǎng)站、工具、素材、源碼、游戲等

    2024年02月22日
    瀏覽(23)
  • 【Android】使用ViewPager2實現(xiàn)輪播圖效果,手動/自動輪播圖

    【Android】使用ViewPager2實現(xiàn)輪播圖效果,手動/自動輪播圖

    這里使用Gilde進行加載圖片:Glide 使用Gilde可以加載網(wǎng)絡圖片還可以提高圖片加載性能。 接下來新建一個子布局item_image,加載viewPage2的子布局。 ViewPage2就是使用recyclerView實現(xiàn)的,所以這里使用方法其實類似。 這里直接繼承RecyclerView.Adapter即可,代碼很簡單不必多說。 創(chuàng)建一個

    2024年02月03日
    瀏覽(32)
  • Android kotlin 實現(xiàn)仿蜜源ViewPager和指示器對應上面TabLayout功能

    Android kotlin 實現(xiàn)仿蜜源ViewPager和指示器對應上面TabLayout功能

    在 app 的 build.gradle 在添加以下代碼 1、 TabLayout : implementation \\\'com.google.android.material:material:1.1.0\\\' 2、 implementation \\\'com.github.li-xiaojun:StateLayout:1.3.4\\\' //allprojects {…增加:maven { url ‘https://jitpack.io’ }…} 3、 implementation \\\'com.github.CymChad:BaseRecyclerViewAdapterHelper:3.0.6\\\' ,這個里面帶的適配

    2024年02月09日
    瀏覽(22)
  • Android 使用ViewPager2+ExoPlayer+VideoCache 實現(xiàn)仿抖音視頻翻頁播放

    Android 使用ViewPager2+ExoPlayer+VideoCache 實現(xiàn)仿抖音視頻翻頁播放

    1. 實現(xiàn)效果 ? ?效果圖中,視頻沒有鋪滿 是因為使用了ExoPlayer的RESIZE_MODE_FIT模式, 雖然使用RESIZE_MODE_FILL模式可以填充整個父布局,但是本Demo中使用的視頻源本身就不適合全屏,會把視頻拉伸,效果不好。 抖音上的視頻源應該都有嚴格的寬高尺寸,才能做到全屏有很好的效

    2023年04月09日
    瀏覽(66)
  • Android:ViewPager2

    Android:ViewPager2

    ViewPager2內(nèi)部使用RecyclerView實現(xiàn),并提供了增強功能 支持水平、垂直方向布局 android:orientation = “vertical” 支持從右到左 android:layoutDirection = “rtl” 禁止滑動 setUserInputEnabled() 可修改Fragment集合 對可修改的Fragment集合進行分頁瀏覽,底層集合更改時調(diào)用notifyDatasetChanged來更新頁

    2024年02月09日
    瀏覽(28)
  • Android進階之路 - ViewPager2 比 ViewPager 強在哪?

    Android進階之路 - ViewPager2 比 ViewPager 強在哪?

    我記得前年(2022)面試的時候有被問到 ViewPager 和 ViewPager2 有什么區(qū)別?當時因為之前工作一直在開發(fā)售貨機相關的項目,使用的技術要求并不高,所以一直沒去了解過 ViewPager2~ 去年的時候正好有相關的功能需求,索性直接用 ViewPager2 進行了 Tip :很多人可能比較關注倆者區(qū)

    2024年02月20日
    瀏覽(25)
  • 【Android基礎面試題】ViewPager與ViewPager2的區(qū)別

    ViewPager和ViewPager2是Android中用于實現(xiàn)滑動頁面切換的控件。它們的主要區(qū)別如下: 實現(xiàn)方式 ViewPager2的內(nèi)部實現(xiàn)是RecyclerView,而ViewPager是通過繼承自ViewGroup實現(xiàn)的。因此,ViewPager2的性能更高。 滑動方向 ViewPager2可以實現(xiàn)橫向和豎向滑動,而ViewPager只能橫向滑動。 Adapter:View

    2024年02月11日
    瀏覽(20)
  • 『Android基礎入門』ViewPager+Fragment+BottomNavigationView實現(xiàn)底部導航

    『Android基礎入門』ViewPager+Fragment+BottomNavigationView實現(xiàn)底部導航

    ?????作者簡介:一位喜歡寫作,計科專業(yè)大三菜鳥 ??個人主頁:starry陸離 如果文章有幫到你的話記得點贊??+收藏??支持一下哦 在ViewPager與Fragment結(jié)合實現(xiàn)多頁面滑動的學習上再進一步,記錄一下ViewPager+Fragment+BottomNavigationView實現(xiàn)底部導航 1.復習ViewPager的用法 2.復習F

    2023年04月08日
    瀏覽(23)
  • android : 底部導航欄的實現(xiàn)(使用ViewPager和BottomNavigationView)

    android : 底部導航欄的實現(xiàn)(使用ViewPager和BottomNavigationView)

    ? 本案例中需要用的控件ViewPager和BottomNavigationView ViewPager:主要是頁面的切換 Fragment:碎片(也就是每個頁面的內(nèi)容) BottomNavigationView:底部導航欄 非常簡單,主要就是一個Viewpager和BottomNavigationView 先來說一下思路:BottomNavigationView底部導航欄? ?ViewPager+Fragment頁面 ? ? ? ?

    2024年02月03日
    瀏覽(27)
  • Android studio中使用ViewPager和BottomNavigationView實現(xiàn)底部導航欄和碎片的同步切換

    Android studio中使用ViewPager和BottomNavigationView實現(xiàn)底部導航欄和碎片的同步切換

    通過幾次的踩雷和摸索,完成了以上的操作,本教程寫的詳細全面,包教包會,對新手有好,看了不會的聯(lián)系我,我倒立洗頭給你看。 所需控件: fragment 作為Android中最常用的控件,它有自己的聲明周期,可以粗略地等比為能夠分屏的activity,但是和activity有區(qū)別,fragment有自

    2024年02月08日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包