Fragment薪伏,所有Android問題的解決方案

前言

目前,Android已經(jīng)可以運行在各種各樣的設備中粗仓,有小屏幕的手機嫁怀,超大屏的平板甚至電視设捐。由于屏幕尺寸的差距,很多情況下塘淑,都是先針對手機開發(fā)一App萝招,然后拷貝一份,修改布局以適應平板神馬超級大屏的存捺。難道無法做到一個App可以同時適應手機和平板么槐沼?Fragment的出現(xiàn)就是為了解決這樣的問題“浦危可以認為Fragment當成Activity的一個界面的一個組成部分兼吓,甚至Activity的界面可以完全有不同的Fragment組成,且Fragment還擁有自己的生命周期和接收、處理用戶的事件,這樣就可以動態(tài)的添加、替換和移除某個Fragment。

目錄
* Fragment的生命周期圖及其要點學習
* Fragment的創(chuàng)建
* Fragment與Activity的交互
* Fragment與Activity的demo實現(xiàn)

谷歌安卓開發(fā)者文檔:A Fragment is a piece of an application's user interface or behavior that can be placed in an Activity. Interaction with fragments is done through FragmentManager, which can be obtained via Activity.getFragmentManager() and Fragment.getFragmentManager().
The Fragment class can be used many ways to achieve a wide variety of results. In its core, it represents a particular operation or interface that is running within a larger Activity. A Fragment is closely tied to the Activity it is in, and can not be used apart from one. Though Fragment defines its own lifecycle, that lifecycle is dependent on its activity: if the activity is stopped, no fragments inside of it can be started; when the activity is destroyed, all fragments will be destroyed.
All subclasses of Fragment must include a public no-argument constructor. The framework will often re-instantiate a fragment class when needed, in particular during state restore, and needs to be able to find this constructor to instantiate it. If the no-argument constructor is not available, a runtime exception will occur in some cases during state restore.

1,F(xiàn)ragment的生命周期

image.png

使用Fragment的一些要點:
3.0版本后引入,即minSdk要大于11
Fragment需要嵌套在Activity中使用,當然也可以嵌套到另外一個Fragment中,但這個被嵌套 的Fragment也是需要嵌套在Activity中的,間接地說,Fragment還是需要嵌套在Activity中!! 受寄主Activity的生命周期影響,當然他也有自己的生命周期!另外不建議在Fragment里面 嵌套Fragment因為嵌套在里面的Fragment生命周期不可控!!!
官方文檔說創(chuàng)建Fragment時至少需要實現(xiàn)三個方法:onCreate( ),onCreateView( ),OnPause( ); 不過貌似只寫一個onCreateView也是可以的...
Fragment的生命周期和Activity有點類似:三種狀態(tài):
Resumed:在允許中的Fragment可見
Paused:所在Activity可見,但是得不到焦點
Stoped: ①調(diào)用addToBackStack(),Fragment被添加到Bcak棧 ②該Activity轉向后臺,或者該Fragment被替換/刪除
ps:停止狀態(tài)的fragment仍然活著(所有狀態(tài)和成員信息被系統(tǒng)保持著),然而,它對用戶 不再可見,并且如果activity被干掉,他也會被干掉.
Fragment的幾個子類:

ps:很多時候我們都是直接重寫Fragment,inflate加載布局完成相應業(yè)務了,子類用的不多,等需要的 時候在深入研究!
對話框:DialogFragment
列表:ListFragment
選項設置:PreferenceFragment
WebView界面:WebViewFragment

  • Fragment的布局

Fragments can be used as part of your application's layout, allowing you to better modularize your code and more easily adjust your user interface to the screen it is running on. As an example, we can look at a simple program consisting of a list of items, and display of the details of each item.
An activity's layout XML can include <fragment> tags to embed fragment instances inside of the layout. For example, here is a simple layout that embeds one fragment:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent">
<fragment class="com.example.android.apis.app.FragmentLayout$TitlesFragment"
android:id="@+id/titles"
android:layout_width="match_parent" android:layout_height="match_parent" />
</FrameLayout>
The layout is installed in the activity in the normal way:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

setContentView(R.layout.fragment_layout);

}

  • v4的fragment與Android的fragment

其實都可以,前面說過Fragment是Android 3.0(API 11)后引入的墓陈,那么如果開發(fā)的app需要 在3.0以下的版本運行呢?比如還有一點點市場份額的2.3!于是乎,v4包就這樣應運而生了, 而最低可以兼容到1.6版本衫樊!至于使用哪個包看你的需求了,現(xiàn)在3.0下手機市場份額其實已經(jīng)不多了,隨街都是4.0以上的挠乳,6.0十月份都出了屎开,你說呢...所以這個時候,你可以直接使用app包下的Fragment 然后調(diào)用相關的方法宪哩,通常都是不會有什么問題的;如果你Fragment用了app包的, FragmentManager和FragmentTransaction都需要是app包的!要么用全部用app,要么全部用v4, 不然可是會報錯的哦!當然如果你要自己的app對于低版本的手機也兼容的話,那么就可以選擇用v4包腔稀!
使用v4包下Fragment要注意的地方:
①如果你使用了v4包下的Fragment,那么所在的那個Activity就要繼承FragmentActivity哦! 案例:今天在xml文件中靜態(tài)地載入fragment,然后重寫了Fragment,但是在加載Activity的時候就報錯了炼团, 大概的提示就是Fragment錯誤還是找不到什么的,name屬性改了幾次還是錯!最后才發(fā)現(xiàn)是用了 v4的包的緣故,只需讓自己的Activity改成FragmentActivity即可!
②之前寫了下面這段代碼,然后報錯: 有點莫名其妙啊,Fragment,FragmentManager,FragmentTransaction都是用的v4包啊, Activity也是繼承FragmentActivity的啊?都改成app包就可以了,但是這不和我們用v4包的 前提沖突了么?其實也是有解決方法的哈?
答:只需要把getFragmentManager( )改成getSupportFragmentManager( )就可以了

2敌呈,F(xiàn)ragment的創(chuàng)建

  •     靜態(tài)加載
    
image.png

示例代碼:
Step 1:定義Fragment的布局,就是fragment顯示內(nèi)容的
Step 2:自定義一個Fragment類,需要繼承Fragment或者他的子類,重寫onCreateView()方法 在該方法中調(diào)用:inflater.inflate()方法加載Fragment的布局文件,接著返回加載的view對象
public class Fragmentone extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment1, container,false);
return view;
}
}
Step 3:在需要加載Fragment的Activity對應的布局文件中添加fragment的標簽浑侥, 記住,name屬性是全限定類名哦陨簇,就是要包含F(xiàn)ragment的包名句携,如:
<fragment
android:id="@+id/fragment1"
android:name="com.jay.example.fragmentdemo.Fragmentone"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
Step 4: Activity在onCreate( )方法中調(diào)用setContentView()加載布局文件即可!

  • 動態(tài)加載
image.png

3,F(xiàn)ragment與Activity的交互

image.png

1)組件獲取

Fragment獲得Activity中的組件: getActivity().findViewById(R.id.list)昨寞;
Activity獲得Fragment中的組件(根據(jù)id和tag都可以):getFragmentManager.findFragmentByid(R.id.fragment1);
2)數(shù)據(jù)傳遞

①Activit傳遞數(shù)據(jù)給Fragment:
在Activity中創(chuàng)建Bundle數(shù)據(jù)包,調(diào)用Fragment實例的setArguments(bundle) 從而將Bundle數(shù)據(jù)包傳給Fragment,然后Fragment中調(diào)用getArguments獲得 Bundle對象,然后進行解析就可以了
②Fragment傳遞數(shù)據(jù)給Activity
在Fragment中定義一個內(nèi)部回調(diào)接口,再讓包含該Fragment的Activity實現(xiàn)該回調(diào)接口, Fragment就可以通過回調(diào)接口傳數(shù)據(jù)了,回調(diào),相信很多人都知道是什么玩意,但是 寫不出來啊,網(wǎng)上的一百度"fragment傳數(shù)據(jù)給Activity",全是李剛老師的那個代碼,真心無語 算了,這里就寫下局部代碼吧,相信讀者一看就懂的了:
Step 1:定義一個回調(diào)接口:(Fragment中)
/接口/
public interface CallBack{
/定義一個獲取信息的方法/
public void getResult(String result);
}
Step 2:接口回調(diào)(Fragment中)
/接口回調(diào)/
public void getData(CallBack callBack){
/獲取文本框的信息,當然你也可以傳其他類型的參數(shù),看需求咯/
String msg = editText.getText().toString();
callBack.getResult(msg);
}
Step 3:使用接口回調(diào)方法讀數(shù)據(jù)(Activity中)
/* 使用接口回調(diào)的方法獲取數(shù)據(jù) /
leftFragment.getData(new CallBack() {
@Override
public void getResult(String result) { /
打印信息*/
Toast.makeText(MainActivity.this, "-->>" + result, 1).show();
}
});
總結下方法: ->在Fragment定義一個接口,接口中定義抽象方法,你要傳什么類型的數(shù)據(jù)參數(shù)就設置為什么類型;
->接著還有寫一個調(diào)用接口中的抽象方法,把要傳遞的數(shù)據(jù)傳過去
->再接著就是Activity了,調(diào)用Fragment提供的那個方法,然后重寫抽象方法的時候進行數(shù)據(jù) 的讀取就可以
Fragment與Fragment之間的數(shù)據(jù)互傳
其實這很簡單,找到要接受數(shù)據(jù)的fragment對象,直接調(diào)用setArguments傳數(shù)據(jù)進去就可以了 通常的話是replace時,即fragment跳轉的時候傳數(shù)據(jù)的,那么只需要在初始化要跳轉的Fragment 后調(diào)用他的setArguments方法傳入數(shù)據(jù)即可!
如果是兩個Fragment需要即時傳數(shù)據(jù),而非跳轉的話,就需要先在Activity獲得f1傳過來的數(shù)據(jù), 再傳到f2了,就是以Activity為媒介~
示例代碼如下:
FragmentManager fManager = getSupportFragmentManager( );
FragmentTransaction fTransaction = fManager.beginTransaction();
Fragmentthree t1 = new Fragmentthree();
Fragmenttwo t2 = new Fragmenttwo();
Bundle bundle = new Bundle();
bundle.putString("key",id);
t2.setArguments(bundle);
fTransaction.add(R.id.fragmentRoot, t2, "~~~");
fTransaction.addToBackStack(t1);
fTransaction.commit();

4,F(xiàn)ragment與Activity的demo實現(xiàn)

  • 布局代碼
    1.actvity_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:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.luolu.fragmentbottomdemo.MainActivity">

<RelativeLayout
    android:id="@+id/ly_top_bar"
    android:layout_width="match_parent"
    android:layout_height="48dp"
    android:background="#201b2d">

    <TextView
        android:id="@+id/txt_topbar"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_centerInParent="true"
        android:gravity="center"
        android:textSize="28sp"
        android:textColor="#eee"
        android:text="Alpha_luolu"
        android:textStyle="bold"/>


    <View
        android:layout_width="match_parent"
        android:layout_height="2px"
        android:background="#31562c"
        android:layout_alignParentBottom="true"/>

</RelativeLayout>



<LinearLayout
    android:id="@+id/ly_tab_bar"
    android:layout_width="match_parent"
    android:layout_height="56dp"
    android:layout_alignParentBottom="true"
    android:background="#4d3a53"
    android:orientation="horizontal">

    <TextView
        android:id="@+id/txt_channel"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:background="@drawable/tab_menu_bg"
        android:drawablePadding="3dp"
        android:drawableTop="@drawable/tab_menu_channel"
        android:gravity="center"
        android:padding="5dp"
        android:text="@string/tab_menu_alert"
        android:textColor="@drawable/tab_menu_text"
        android:textSize="16sp" />

    <TextView
        android:id="@+id/txt_message"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:background="@drawable/tab_menu_bg"
        android:drawablePadding="3dp"
        android:drawableTop="@drawable/tab_menu_message"
        android:gravity="center"
        android:padding="5dp"
        android:text="@string/tab_menu_profile"
        android:textColor="@drawable/tab_menu_text"
        android:textSize="16sp" />

    <TextView
        android:id="@+id/txt_better"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:background="@drawable/tab_menu_bg"
        android:drawablePadding="3dp"
        android:drawableTop="@drawable/tab_menu_better"
        android:gravity="center"
        android:padding="5dp"
        android:text="@string/tab_menu_pay"
        android:textColor="@drawable/tab_menu_text"
        android:textSize="16sp" />

    <TextView
        android:id="@+id/txt_setting"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:background="@drawable/tab_menu_bg"
        android:drawablePadding="3dp"
        android:drawableTop="@drawable/tab_menu_setting"
        android:gravity="center"
        android:padding="5dp"
        android:text="@string/tab_menu_setting"
        android:textColor="@drawable/tab_menu_text"
        android:textSize="16sp"/>

</LinearLayout>

<View
    android:id="@+id/div_tab_bar"
    android:layout_width="match_parent"
    android:layout_height="2px"
    android:background="#fff"
    android:layout_above="@id/ly_tab_bar"/>


<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_below="@id/ly_top_bar"
    android:layout_above="@id/div_tab_bar"
    android:id="@+id/ly_content">

</FrameLayout>

</RelativeLayout>

2.fg_content.xml

<?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">

<TextView
    android:id="@+id/txt_content"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:text="GG"
    android:textColor="#ec081f"
    android:textSize="48sp"
    android:textStyle="bold"/>

</LinearLayout>

Resource
1.ic_launcher_background.xml

<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android";
android:width="108dp"
android:height="108dp"
android:viewportHeight="108"
android:viewportWidth="108">
<path
android:fillColor="#26A69A"
android:pathData="M0,0h108v108h-108z" />
<path
android:fillColor="#00000000"
android:pathData="M9,0L9,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,0L19,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M29,0L29,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M39,0L39,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M49,0L49,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M59,0L59,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M69,0L69,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M79,0L79,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M89,0L89,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M99,0L99,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,9L108,9"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,19L108,19"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,29L108,29"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,39L108,39"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,49L108,49"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,59L108,59"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,69L108,69"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,79L108,79"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,89L108,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,99L108,99"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,29L89,29"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,39L89,39"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,49L89,49"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,59L89,59"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,69L89,69"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,79L89,79"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M29,19L29,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M39,19L39,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M49,19L49,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M59,19L59,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M69,19L69,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M79,19L79,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
</vector>

ic_launcher_foreground.xml

<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android";
android:width="108dp"
android:height="108dp"
android:viewportHeight="108"
android:viewportWidth="108">
<path
android:fillColor="#26A69A"
android:pathData="M0,0h108v108h-108z" />
<path
android:fillColor="#00000000"
android:pathData="M9,0L9,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,0L19,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M29,0L29,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M39,0L39,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M49,0L49,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M59,0L59,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M69,0L69,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M79,0L79,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M89,0L89,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M99,0L99,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,9L108,9"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,19L108,19"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,29L108,29"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,39L108,39"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,49L108,49"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,59L108,59"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,69L108,69"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,79L108,79"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,89L108,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,99L108,99"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,29L89,29"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,39L89,39"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,49L89,49"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,59L89,59"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,69L89,69"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,79L89,79"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M29,19L29,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M39,19L39,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M49,19L49,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M59,19L59,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M69,19L69,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M79,19L79,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
</vector>

  • MainActivity.java

package com.example.luolu.fragmentbottomdemo;

import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.widget.FrameLayout;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

//UI Object
private TextView txt_topbar;
private TextView txt_channel;
private TextView txt_message;
private TextView txt_better;
private TextView txt_setting;
private FrameLayout ly_content;

//Fragment Object
private MyFragment fg1,fg2,fg3,fg4;
private FragmentManager fManager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.activity_main);
    fManager = getFragmentManager();
    bindViews();
    txt_channel.performClick();   //模擬一次點擊享怀,既進去后選擇第一項
}

//UI組件初始化與事件綁定
private void bindViews() {
    txt_topbar = (TextView) findViewById(R.id.txt_topbar);
    txt_channel = (TextView) findViewById(R.id.txt_channel);
    txt_message = (TextView) findViewById(R.id.txt_message);
    txt_better = (TextView) findViewById(R.id.txt_better);
    txt_setting = (TextView) findViewById(R.id.txt_setting);
    ly_content = (FrameLayout) findViewById(R.id.ly_content);

    txt_channel.setOnClickListener(this);
    txt_message.setOnClickListener(this);
    txt_better.setOnClickListener(this);
    txt_setting.setOnClickListener(this);
}

//重置所有文本的選中狀態(tài)
private void setSelected(){
    txt_channel.setSelected(false);
    txt_message.setSelected(false);
    txt_better.setSelected(false);
    txt_setting.setSelected(false);
}

//隱藏所有Fragment
private void hideAllFragment(FragmentTransaction fragmentTransaction){
    if(fg1 != null) {
        fragmentTransaction.hide(fg1);
    }
    if(fg2 != null) {
        fragmentTransaction.hide(fg2);
    }
    if(fg3 != null) {
        fragmentTransaction.hide(fg3);
    }
    if(fg4 != null) {
        fragmentTransaction.hide(fg4);
    }
}


@Override
public void onClick(View v) {
    FragmentTransaction fTransaction = fManager.beginTransaction();
    hideAllFragment(fTransaction);
    switch (v.getId()){
        case R.id.txt_channel:
            setSelected();
            txt_channel.setSelected(true);
            if(fg1 == null){
                fg1 = new MyFragment("我是第一個Fragment");
                fTransaction.add(R.id.ly_content,fg1);
            }else{
                fTransaction.show(fg1);
            }
            break;
        case R.id.txt_message:
            setSelected();
            txt_message.setSelected(true);
            if(fg2 == null){
                fg2 = new MyFragment("我是第二個Fragment");
                fTransaction.add(R.id.ly_content,fg2);
            }else{
                fTransaction.show(fg2);
            }
            break;
        case R.id.txt_better:
            setSelected();
            txt_better.setSelected(true);
            if(fg3 == null){
                fg3 = new MyFragment("我是第三個Fragment");
                fTransaction.add(R.id.ly_content,fg3);
            }else{
                fTransaction.show(fg3);
            }
            break;
        case R.id.txt_setting:
            setSelected();
            txt_setting.setSelected(true);
            if(fg4 == null){
                fg4 = new MyFragment("我是第四個Fragment");
                fTransaction.add(R.id.ly_content,fg4);
            }else{
                fTransaction.show(fg4);
            }
            break;
    }
    fTransaction.commit();
}

}

  • MyFragment.java

package com.example.luolu.fragmentbottomdemo;

import android.annotation.SuppressLint;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

/**

  • @author luolu
  • @date 2017/11/17
    */

@SuppressLint("ValidFragment")
public class MyFragment extends Fragment {

private String content;
public MyFragment(String content) {
    this.content = content;
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fg_content,container,false);
    TextView txt_content = (TextView) view.findViewById(R.id.txt_content);
    txt_content.setText(content);
    return view;
}

}

資源文件沒全部復制過來羽峰,這里截個圖


image.png

運行結果截圖:


image.png

demo中的底部的圖片,大家自己換一下!梅屉!

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末值纱,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子坯汤,更是在濱河造成了極大的恐慌虐唠,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件惰聂,死亡現(xiàn)場離奇詭異疆偿,居然都是意外死亡,警方通過查閱死者的電腦和手機庶近,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門翁脆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人鼻种,你說我怎么就攤上這事反番。” “怎么了叉钥?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵罢缸,是天一觀的道長。 經(jīng)常有香客問我投队,道長枫疆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任敷鸦,我火速辦了婚禮息楔,結果婚禮上,老公的妹妹穿的比我還像新娘扒披。我一直安慰自己值依,他們只是感情好,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布碟案。 她就那樣靜靜地躺著愿险,像睡著了一般。 火紅的嫁衣襯著肌膚如雪价说。 梳的紋絲不亂的頭發(fā)上辆亏,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天,我揣著相機與錄音鳖目,去河邊找鬼扮叨。 笑死,一個胖子當著我的面吹牛领迈,可吹牛的內(nèi)容都是我干的甫匹。 我是一名探鬼主播甸鸟,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼兵迅!你這毒婦竟也來了?” 一聲冷哼從身側響起薪贫,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤恍箭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后瞧省,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扯夭,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年鞍匾,在試婚紗的時候發(fā)現(xiàn)自己被綠了交洗。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡橡淑,死狀恐怖构拳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情梁棠,我是刑警寧澤置森,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站符糊,受9級特大地震影響凫海,放射性物質發(fā)生泄漏。R本人自食惡果不足惜男娄,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一行贪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧模闲,春花似錦建瘫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至翁授,卻和暖如春拣播,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背收擦。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工贮配, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人塞赂。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓泪勒,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子圆存,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容