1. 程式人生 > >Fragment巢狀Fragment,Viewpager和Fragment聯動,懶載入

Fragment巢狀Fragment,Viewpager和Fragment聯動,懶載入

一、效果展示


二、主頁佈局

<?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"
android:fitsSystemWindows="true">
    <RelativeLayout
android:id="@+id/ll_contest"
android:layout_width="match_parent" android:layout_height="match_parent" android:layout_above="@+id/content" android:layout_weight="1" android:orientation="vertical" /> <LinearLayout android:id="@+id/content" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom=
"true" android:background="@drawable/bg_dibu" android:gravity="center" android:orientation="horizontal"> <TextView android:id="@+id/main_home" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:clickable="true" android:drawablePadding="2dp" android
:drawableTop="@drawable/main_btn_home" android:gravity="center" android:selectAllOnFocus="true" android:text="@string/home" android:textColor="@drawable/main_button_color" android:textSize="12dp" /> <TextView android:id="@+id/main_tipoff" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:clickable="true" android:drawablePadding="2dp" android:drawableTop="@drawable/main_btn_tipoff" android:gravity="center" android:text="@string/tipoff" android:textColor="@drawable/main_button_color" android:textSize="12dp" /> <View android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" /> <TextView android:id="@+id/main_thesun" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:clickable="true" android:drawablePadding="2dp" android:drawableTop="@drawable/main_btn_thesun" android:gravity="center" android:text="@string/thesun" android:textColor="@drawable/main_button_color" android:textSize="12dp" /> <TextView android:id="@+id/main_own" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:clickable="true" android:drawablePadding="2dp" android:drawableTop="@drawable/main_btn_own" android:gravity="center" android:text="@string/own" android:textColor="@drawable/main_button_color" android:textSize="12dp" /> </LinearLayout> <TextView android:id="@+id/main_live" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:layout_marginBottom="0dp" android:clickable="true" android:drawablePadding="2dp" android:drawableTop="@drawable/main_btn_live" android:gravity="center" android:scaleType="centerInside" android:selectAllOnFocus="true" android:text="@string/live" android:textColor="@drawable/main_button_color" android:textSize="12dp" /> </RelativeLayout>

三、Fragment巢狀

ArratList<TextVeiw> views=new ArrayList();
 把底部的5個TextVeiw加入集合views中
  private void initView() {
    views = new ArrayList<>();
views.clear();
views.add(mainHome);
views.add(mainTipoff);
views.add(mainLive);
views.add(mainThesun);
views.add(mainOwn);
views.get(0).setSelected(true);
}


四、TextView點選事件

@OnClick({R.id.main_live, R.id.main_home, R.id.main_tipoff, R.id.main_thesun, R.id.main_own})
public void onViewClicked(View view) {
    int current = oldIndex;
    switch (view.getId()) {
        case R.id.main_live:
            current = 2;
            break;
        case R.id.main_home:
            current = 0;
            break;
        case R.id.main_tipoff:
            current = 1;
            break;
        case R.id.main_thesun:
            current = 3;
            break;
        case R.id.main_own:
            current = 4;
            break;
}
    showCurrentFragment(current);
}

五、初始化Fragment

/**
     * 初始化用到的Fragment
     */
private void initFragments() {
        homeFragment = new HomeFragment();
tipOffFragment = new TipOffFragment();
getFragment = new GetFragment();
sunFragment = new SunFragment();
ownFragment = new OwnFragment();
fragments = new ArrayList<>();
fragments.clear();
fragments.add(homeFragment);
fragments.add(tipOffFragment);
fragments.add(getFragment);
fragments.add(sunFragment);
fragments.add(ownFragment);
//        預設載入前兩個Fragment,其中第一個展示,第二個隱藏
getSupportFragmentManager().beginTransaction()
                .add(R.id.ll_contest, homeFragment)
              .add(R.id.ll_contest, tipOffFragment)
              .hide(tipOffFragment)
.show(homeFragment)
                .commit();
        showCurrentFragment(0);
}

六、處理Fragment的切換

/**
 * 展示當前選中的Fragment
 *
 * @param currentIndex
*/

 private void showCurrentFragment(int currentIndex) {int oldInex
    if (currentIndex != oldIndex) {
        views.get(oldIndex).setSelected(false);
views.get(currentIndex).setSelected(true);
FragmentTransaction ft = getSupportFragmentManager()
                .beginTransaction();
ft.hide(fragments.get(oldIndex));
        if (!fragments.get(currentIndex).isAdded()) {
            ft.add(R.id.ll_contest, fragments.get(currentIndex));
}
        ft.show(fragments.get(currentIndex)).commit();
oldIndex = currentIndex;
}
}

七、fragment的佈局

<android.support.design.widget.TabLayout
android:id="@+id/tablayout_topoff"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
app:tabIndicatorColor="@color/cf62c52"
app:tabIndicatorHeight="3dp"
app:tabSelectedTextColor="@color/cf62c52"
app:tabTextColor="@color/c676767" />
<android.support.v4.view.ViewPager
android:id="@+id/vp_topoff"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp">
</android.support.v4.view.ViewPager>

八、內部fragment的使用,viewPager的聯動


tablayoutTopoff  //佈局中的TabLayout檔案。
vpTopoff //是佈局中的內部的viewpager
//設定介面卡myPaperAdapter = new MyPaperAdapter(getFragmentManager());vpTopoff.setAdapter(myPaperAdapter);/*//設定tablout 滑動模式tablayoutTopoff.setTabMode(TabLayout.MODE_SCROLLABLE);*///聯絡tabLayout和viwpagertablayoutTopoff.setupWithViewPager(vpTopoff);



九、內部fragment的介面卡,setTitle

/**
 * 設定頭目
 */
private Fragment setTitle(Fragment fragment, String title,int i) {
    Bundle args = new Bundle();
args.putString("title", title);
args.putInt("conditionType",i);  //區分fragment的位置,以便fragment相似時,建立同一的內部baseFragment
fragment.setArguments(args);
    return fragment;
}

fragments //下面顯示fragment的集合

/** * 介面卡 */private class MyPaperAdapter extends FragmentPagerAdapter { public MyPaperAdapter(FragmentManager fm) { super(fm);} @Overridepublic Fragment getItem(int position) { return fragments.get(position);} @Overridepublic int getCount() { return fragments.size();} @Overridepublic CharSequence getPageTitle(int position) { //設定tablayout的標題 return fragments.get(position).getArguments().getString("title");}}

十、baseFragment的不同之處 

   setUserVisibleHint(Boolean)在fragment所有初始化方法之前呼叫,在fragment視覺化發生變化是呼叫。  在onVisible中,表示使用者可見。

@Override 
public void setUserVisibleHint(boolean isVisibleToUser) {       //fragment的顯示改變,呼叫的方法。初始化在
    super.setUserVisibleHint(isVisibleToUser);
    if (getUserVisibleHint()) {
        isVisable = true;
//初始化完成,切處於可見狀態
onVisible();
} else {
        isVisable = false;
onInVisible();
}
}

protected void onInVisible() {

}

protected void onVisible() {
    initData();
}

十一、initData()--載入資料的方法  方法的使用;

注意: 當第一個Fragment在建立時,在onAtach,onCraet方法之前呼叫,fragment還沒有初始化。

所以在initData()中,應該對執行條件進行限制:

Boolean  isPrepared=fasle;
public void initData() {
    if (!isPrepared || !isVisable) {  //載入資料判斷是否可見,進行懶載入  isPrepared 是判斷Fragment是否初始化的條件
return;
}
//載入資料
}

public void onCreat(){
   super.onCreat();
   isPrepared=true;
   initData();

}

相關推薦

FragmentFragmentViewpagerFragment聯動載入

一、效果展示 二、主頁佈局 <?xml version="1.0" encoding="utf-8"?><!--主頁頁面--> <RelativeLayout xmlns:android="http://schemas.android.c

Android 多層fragment viewPager不顯示的問題

版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/zkll200/article/details/73692518 先看一段錯誤程式碼,這段程式碼寫在一個 Fragment 中: private void initVi

FragmentFragmentViewpager

import android.app.Fragment; import android.app.FragmentManager; import android.app.FragmentTransaction; import android.support.annotatio

PullToRefreshListView上拉下拉+輪播圖多條目+fragmentfragment+二次取樣+側拉點選切換fragment+PullToRefreshGritView圖片展示

側拉 程式碼 1提取的基類 1.1Activity的基類 package com.example.zonghelianxi02.ui.activity; import android.os.Bundle; import android.support.annotation.Nulla

FragmentTabLatoutPullToRefreshListView

1.側拉布局 <?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.DrawerLayout xmlns:android=“http://schemas.android.com/apk/res

Android開發中FragmentFragments遇到的問題

Fragment,簡稱碎片,是Android 3.0(API11)提出的,為了相容低版本,support-v4庫中也開發了一套Fragment API,最低相容Android 1.6。 Fragment是依賴於Activity的,不能獨立存在的。 一個Acti

第16天ViewPager案例4:ViewPager+Fragment

第16天ViewPager案例4:ViewPager+Fragment巢狀 ViewPager 一.效果 二.思路: 三.父Viewpager程式碼 四.首頁Fragment程式碼 總結:程式碼結構:

Android開發-從原始碼分析FragmentPagerAdapter生命週期解決重建問題

介紹 眾所周知在Android開發中Fragment的生命週期非常複雜,複雜得甚至讓Square公司提出了我為什麼主張反對使用Android Fragment轉而提倡使用自定義View組合替代Fragment。但是沒辦法公司專案還是使用了很多Fragment巢狀

FragmentViewPager切換後資料消失ViewPager空白問題

getChildFragmentManager替換掉getFragmentManager 或者getSupportFragmentManager()問題就解決了。具體的原理是什麼,有待學習。  getFragmentManager到的是activity對所包含fragme

Fragment問題Fragment一個ViewPager展示子Fragment

我碰到的問題Fragment裡巢狀一個ViewPager展示子Fragment,展示子fragment第二次進入該fragment不顯示資料如果外層fragment每次切換都從新建立, oncreateview每次都從新執行,導致adapter重新new了,所以子fragment就不顯示了,保證外層的frag

Fragment高德地圖切換黑屏切換卡死退出解決方案

佈局: - 首頁Activity使用FragmentTabHost切換3個Fragment,Fragment1中巢狀2個Fragment,一個Fragment裝了高德地圖MapView,還有一個普通的Fragment; 問題1: - 在首頁從地圖Fragm

Android 中 Fragment Fragment使用存在的bug附完美解決方案

原文地址:https://blog.csdn.net/u014365133/article/details/73176068 自從Android3.0引入了Fragment之後,使用Activity去巢狀一些Fragment的做法也變得更加流行,這確實是Fra

側滑+fragment切換頁面+fragment+二次取樣+輪播圖+gridview展示圖片+網路請求資料+資料庫

全域性配置Appliction 所需要的依賴有:implementation ‘com.google.code.gson:gson:2.8.5’ implementation ‘com.nostra13.universalimageloader:universal-image-loader:

Fragment getChildFragmntManager FragmentManagerImpl.getFragment導致NullPointerExcep

這個問題很困擾我  一直搜尋相關的知識  直到在s'tack over flow上看到了一個人的提問  從評論中才將這個問題解決  不知道是什麼原理   但確實解決了我的問題  不知道怎麼轉載  現附上網址  希望可以幫大家解決困難  如果侵權  請留言給我  我會及時刪除

Android仿小米商城底部導航欄之二(BottomNavigationBar、ViewPagerFragment聯動使用)

簡介 在前文《Android仿小米商城底部導航欄(基於BottomNavigationBar)》我們使用BottomNavigationBar控制元件模仿實現了小米商城底部導航欄效果。接下來更進一步的,我們將通過BottomNavigationBar控制元件和

FragmentFragmentViewPager 正常使用姿勢

getFragmentManager到的是activity對所包含fragment的Manager,而如果是fragment巢狀fragment,那麼就需要利用getChildFragmentMan

Android開發ViewPagerFragment結合使用實現新聞類app( 三 )(基本成型的app)

//該類為我們的標題欄的自定義View public class MyLinearLayout extends LinearLayout { public MyLinearLayout(Context context, AttributeSet attrs) { super(cont

Android中Fragment生命週期響應問題

問題闡述 : 主介面有四個Fragment 分別為A、B、C、D 這些為第一層Fragment(建立方式是由事務提交形式),其中B Fragment中佈局為ViewPager,裡面是放的三個Fragment 分別為B_1、B_2、B_3,這些稱為第二層Frag

Android ViewPagerFragment實現仿微信導航介面及滑動效果

1 先看看實現的效果: ps:上面每一幀Fragment中,包含是來自網路的圖片; 實現ViewPager+Fragment的頁面滑動和底部導航原理 主佈局檔案如下: <?xml version="1.0" encoding="utf-8"?> <L

側滑+多條目+重新整理載入+fragment+Banner

MainActivity package com.bwie.mouthxx1; import android.support.design.widget.TabLayout; import android.support.v4.view.ViewPager;