androidfragment菜單
『壹』 Android組件之Fragment(一)---基礎知識與運用
Fragment是Android3.0後引入的一個新的API,他出現的初衷是為了適應大屏幕的平板電腦, 當然現在他仍然是平板APP UI設計的寵兒,而且我們普通手機開發也會加入這個Fragment, 我們可以把他看成一個小型的Activity,又稱Activity片段!想想,如果一個很大的界面,我們 就一個布局,寫起界面來會有多麻煩,而且如果組件多的話是管理起來也很麻煩!而使用Fragment 我們可以把屏幕劃分成幾塊,然後進行分組,進行一個模塊化的管理!從而可以更加方便的在 運行過程中動態地更新Activity的用戶界面!另外Fragment並不能單獨使用,他需要嵌套在Activity 中使用,盡管他擁有自己的生命周期,但是還是會受到宿主Activity的生命周期的影響,比如Activity 被destory銷毀了,他也會跟著銷毀!
引用官方的一張圖片,其實已經說明問題了,就是為了更好的適配大屏,在大屏的時候,不需要去在一個activity內部通過復雜的布局和界面去實現,只需要去在一個activity內部,通過多個fragment來做界面布局實現即可,而且針對於多個fragment來說, 每個fragment有單獨的生命周期,
Demo樣例,我們在一個界面中,有上下兩個fragment,如圖所示:
Step 2: Fragment創建,視圖載入,數據賦值
BlankFragment .java
Step 3: Activity在onCreate( )方法中調用setContentView()之後調用FragmentTransaction 進行事務提交
FragmentTestActivity.java
在xml中聲明兩個fragment,指定為具體的fragment
Step 1:定義Fragment的布局,就是fragment顯示內容的
Step 2:自定義一個Fragment類,需要繼承Fragment或者他的子類,重寫onCreateView()方法 在該方法中調用:inflater.inflate()方法載入Fragment的布局文件,接著返回載入的view對象
BlankFragment.java
Step 3:在需要載入Fragment的Activity對應的布局文件中添加fragment的標簽, 記住,name屬性是全限定類名哦,就是要包含Fragment的包名,如:
Step 4: Activity在onCreate( )方法中調用setContentView()載入布局文件即可!
針對在一個Activity中的某個Layout中切換Fragment,,無非兩種方法:
我們自己看一下方法注釋
源碼方法注釋裡面說的很明白,這個方法會移除所有的fragment,然後添加當前的fragment。
這時分為兩種情況,一種是fragment已有並且在前台展示,一種是未有或者在後台,針對於前者,此時replace,生命周期不會發生變化,針對後者,生命周期會重新走
分為兩種情況,一種fragment已存在,一種未存在,針對於前者,生命周期無變化,但是會回調onHiddenChanged方法,針對於後者,生命周期會創建一次。
1.Fragment是Google官方引入的一個為了適配大屏、多頁面的一個組件。您可以理解為它就是一個類而已,只不過裡麵包含了View,並且與activity的生命周期進行了關聯。
2.動態載入與靜態載入相對來說,建議使用動態載入,靜態載入固定在了xml文件中,永遠不變。
3.replace的fragment如果不在前台,會執行所有生命周期,反之不會執行任何生命周期方法;hide+show生命周期並不會發生變化,但是會回調onHiddenChanged方法,在實際開發中,建議add之後,使用hide+show來操作fragment,一方面減少資源的重復載入和創建,另外一方面提升用戶體驗感。
4.fragment的生命周期大體上和activity一致,但是前期和後期多了一些東西,因為fragment內部有view,那麼這個view需要進行創建、然後添加到activity內部,所以相應的在onCreate與onStart之間就多了幾個方法-onCreateView、onViewCreated。相同的道理,fragment的view與activity解綁,也相應的在onStop與onDestory之間多個方法-onDestroyView。onAttach與onDetach可以理解為視圖與activity產生關聯和接觸關聯,是最開始和最後的步驟。
Demo地址
『貳』 Android studio右鍵new菜單中無activity,Fragment等選項,請問如何添加這些選項呢謝謝!在線等。
"File -> Sync Project with Gradle files" 按這個路徑重新操作
重新跟gradle文件做一次工程匹配,一般是您上次有異常操作
或者使用的版本改過配置,默認讓你不同步
但是這個操作有個前提就是您的SDK是健全的,還是不行的話,退回到android studio的啟動面板,在那啟動SDK manager 更新下你的SDK
『叄』 android 怎樣讓fragment全屏,隱藏標題欄
讓Fragment
所屬的Activity
全屏就可以了
Fragment
本身就是在Activity裡面存在的
後者是前者的容器容器全屏了
他自然也全屏了
一勞永逸的方法
在Manifest文件裡面的Aplication
裡面的那個theme
android:theme="@android:style/Theme.Black.NoTitleBar"
例如
<application
android:allowBackup="true"
android:icon="@drawable/logo"
android:label="@string/app_name"
android:theme="@android:style/Theme.Black.NoTitleBar"
>
『肆』 Android開發 :Fragment懶載入的幾種方式與性能對比
TabLayout+ViewPager+Fragment是我們開發常用的組合。ViewPager的默認機制就是把全部的Fragment都載入出來,而為了保障一些用戶體驗,我們使用懶載入的Fragment,就是讓我們再用戶可見這個Fragment之後才處理業務邏輯。
而我們在一些設備或版本中可能就出現懶載入失效的問題。其實谷歌早就把一些懶載入的方案都標記棄用了,我們一直都用的老的隨時會失效的Api。萬一哪天徹底失效了就會導致線上事故。
接下來我們就看看Fragment的懶載入是如何演變的。谷歌又是推薦我們如何使用的。
在AndroidX還沒出來的時候,大家的懶載入應該都是這樣。判斷setUserVisibleHint的方法,當用戶可見的時候才回調方法去載入邏輯。
例如的我封裝:
使用的示例:
擴展方法:
Fragment:
到此就實現了onLazyInitData的回調,只有出現Fragment顯示在前台的時候才會調用方法,執行邏輯。
每次判斷 setUserVisibleHint 和 onHiddenChanged 也麻煩,並且他們並不穩定,我也遇到過不回調的時候。
Android出來之後,給 FragmentStatePagerAdapter 添加了一個 @Behavior int behavior 的參數。
其本質就是內部幫你處理和切換MaxLifecycle:
如何使用呢:
之前的擴展方法以及預留了 behavior 參數,當為1的時候就不會回調 setUserVisibleHint 方法了,我們直接監聽 OnResume 即可。
注意這個頁面繼承的就不是我們自定義的懶載入Fragment了。普通的Fragment 回調 onResume 即可。
ViewPager2出來之後。我們的 FragmentStatePagerAdapter 退出歷史舞台。
即便能用,即便效果還是和ViewPage2的效果一樣,但是還是標記廢棄了。具體原因我也不知道,據說是因為老版本會出現問題導致數據丟失,頁面空白。
ViewPage2我們都知道內部是通過RV實現的。但是對於Fragment的處理有單獨的Adapter實現。
擴展方法:
使用:
使用的方式和ViewPager差不多,這里的Fragment也是使用普通的Fragment即可。
內存佔用分別取三組數據
ViewPager數據
ViewPager2數據
結論 ViewPager2基於RV實現的效果還是比老版ViewPager要騷好一點。
並且老版本標記廢棄,大家如果是用ViewPager2的話,還是推薦使用ViewPager2實現。如果大家還是用的老版本的ViewPager也推薦使用behavor參數。使用 onResume 實現懶載入的實現。以後再換到ViewPager2的話,可以無縫切換過來。
說明一下,測試數據僅供參考,畢竟我也不是專業測試,測試數據源也不不多。如有不對的地方,也望大家指正。
『伍』 android怎麼在tabbed fragment 底部設置
自定義底部菜單欄實現方式
(1)對應的 Fragment 編輯代碼和布局實現在前面的 Fragment介紹和簡單實現 中已經有提及,代碼中沒復雜的地方,此處略過,具體可看實例代碼。
(2)菜單欄實現,這里使用代碼實現的,其實也可以用布局文件實現,代碼如下:
『陸』 android Fragment中怎麼更新數據
Fragment中的內容不是固定的,甚至布局都不是固定的,這時我們需要動態更新Fragment的數據或布局。所以本文將介紹更新Fragment數據的一種方法(可能不是最好的,如果大家有更好的方法一定要跟我說啊~)。
首先我們快速實現下「選項卡」切換效果。
註:為了簡單起見,我們不加選項卡的標題。
步驟很簡單,在activity布局中創建一個ViewPager節點,為ViewPager設置適配器(PagerAdapter),適配器產生數據填充ViewPager。
Activity布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" >
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</LinearLayout>
主界面只有一個ViewPager節點。
下面創建3個Fragment:
package com.example.viewpagerdemo2;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class Tab3 extends Fragment
{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
return inflater.inflate(R.layout.tab3,null);
}
}
代碼很簡單,直接在oncreateView方法中使用布局填充器(LayoutInflater)填充一個View布局即可。
布局如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#0000ff"
android:orientation="vertical" >
<TextView
android:id="@+id/tab1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="我是第三個界面"
/>
</LinearLayout>
其他兩個Fragment跟這個一模一樣,這里就不貼了。
Fragment都創建好之後,我們來寫Activity的邏輯,我們需要為ViewPager指定一個PagerAdapter。
google為我們提供了方便的類叫FragmentPagerAdapter,我們只需繼承這個類並復寫getItem和getCount即可。
MainActivity如下:
package com.example.viewpagerdemo2;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
public class MainActivity extends FragmentActivity
{
private ViewPager vPager = null;
private static final int TAB_COUNT = 3;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
vPager = (ViewPager) findViewById(R.id.viewpager);
vPager.setAdapter(new MyPagerAdapter(getSupportFragmentManager()));
}
public class MyPagerAdapter extends FragmentPagerAdapter
{
public MyPagerAdapter(FragmentManager fm)
{
super(fm);
}
@Override
public Fragment getItem(int position)
{
switch (position)
{
case 0:
return new Tab1();
case 1:
return new Tab2();
case 2:
return new Tab3();
}
return null;
}
@Override
public int getCount()
{
return TAB_COUNT;
}
}
}
代碼很簡單,就不過多解釋了。我在FragmentPagerAdapter的getItem方法中根據position直接new出Fragment對象.