Android Fragment工程學(xué)習(xí)筆記

首先工程來(lái)自github上的Android工程 FragmentNavigator窟绷,新手有興趣可以去下載運(yùn)行。


看了工程所有的代碼接奈,我來(lái)總結(jié)一下主要的實(shí)現(xiàn)步驟:

主要使用以下兩個(gè)類 FragmentNavigator踢涌、BottomNavigatorView來(lái)實(shí)現(xiàn)下方tabBar控制器切換(Android通常叫做Fragment,因本人做iOS的)

private FragmentNavigator?mNavigator;

private BottomNavigatorView?bottomNavigatorView;//底部tab區(qū)域視圖

1序宦、其中FragmentNavigator是封裝的類睁壁,定義了showFragment

方法? ,BottomNavigatorView繼承于LinearLayoutCompat(其中LinearLayoutCompat是對(duì)LinearLayout擴(kuò)展和兼容

2、MainActivity實(shí)現(xiàn)了BottomNavigatorView

類的OnBottomNavigatorViewItemClickListener

接口潘明,BottomNavigatorView

類實(shí)現(xiàn)了如下構(gòu)造方法

public BottomNavigatorView(Context context, AttributeSet attrs,int defStyleAttr) {

? ? super(context, attrs, defStyleAttr);

? ? setOrientation(HORIZONTAL);

? ? inflate(context, R.layout.layout_bottom_navigator,this);

? ? for (int i =0; i < getChildCount(); i++) {

? ? ? ? View view = getChildAt(i);

? ? ? ? final int finalI = i;

? ? ? ? view.setOnClickListener(new OnClickListener() {

? ? ? ? ? ? @Override //點(diǎn)擊tab會(huì)調(diào)用

? ? ? ? ? ? public void onClick(View v) {//tab事件首先在這里觸發(fā)的P屑痢!G怠厚宰!

? ? ? ? ? ? ? ? System.out.println("setOnClickListener1");

? ? ? ? ? ? ? ? //調(diào)用了接口方法,onBottomNavigatorViewItemClick方法在MainActivity類中實(shí)現(xiàn)

? ? ? ? ? ? ? ? mOnBottomNavigatorViewItemClickListener.onBottomNavigatorViewItemClick(finalI, v);

? ? ? ? ? ? }

? ? ? ? });

? ? }

}

MainActivity類中

@Override? //實(shí)現(xiàn)了接口方法

public void onBottomNavigatorViewItemClick(int position, View view) {

? ? System.out.println("我響應(yīng)了接口方法");

? ? setCurrentTab(position);

}

private void setCurrentTab(int position) {

? ? mNavigator.showFragment(position);//用來(lái)實(shí)現(xiàn)切換動(dòng)畫(huà)

? ? bottomNavigatorView.select(position);//用來(lái)選中tab位置遂填,改變tab文字與圖標(biāo)顏色

}

其中showFragment方法是FragmentNavigator

類封裝的铲觉,select方法是BottomNavigatorView

類封裝的

public void showFragment(int position,boolean reset,boolean allowingStateLoss) {

? ? this.mCurrentPosition = position;

? ? FragmentTransaction transaction =mFragmentManager.beginTransaction();

? ? int count =mAdapter.getCount();

? ? for (int i =0; i < count; i++) {

? ? ? ? if (position == i) {

? ? ? ? ? ? if (reset) {

? ? ? ? ? ? ? ? remove(position, transaction);

? ? ? ? ? ? ? ? add(position, transaction);

? ? ? ? ? ? }else {

? ? ? ? ? ? ? ? show(i, transaction);

? ? ? ? ? ? }

? ? ? ? }else {

? ? ? ? ? ? hide(i, transaction);

? ? ? ? }

? ? }

? ? if (allowingStateLoss) {

? ? ? ? transaction.commitAllowingStateLoss();

? ? }else {

? ? ? ? transaction.commit();

? ? }

}

//點(diǎn)擊tab會(huì)調(diào)用

? ? public void select(int position) {

? ? ? ? System.out.println("position:"+position);

? ? ? ? for (int i =0; i < getChildCount(); i++) {

? ? ? ? ? ? View child = getChildAt(i);

? ? ? ? ? ? if (i == position) {

? ? ? ? ? ? ? ? selectChild(child,true);

? ? ? ? ? ? }else {

? ? ? ? ? ? ? ? selectChild(child,false);

? ? ? ? ? ? }

? ? ? ? }

? ? }

3、在MainActivity類中構(gòu)造方法中

@Override

protected void onCreate(Bundle savedInstanceState) {

? ? super.onCreate(savedInstanceState);

? ? setContentView(R.layout.activity_main);

? ? mNavigator =new FragmentNavigator(getSupportFragmentManager(),new FragmentAdapter(), R.id.container);

? ? mNavigator.setDefaultPosition(DEFAULT_POSITION);//設(shè)置tab的默認(rèn)位置

? ? mNavigator.onCreate(savedInstanceState);

? ? bottomNavigatorView = (BottomNavigatorView) findViewById(R.id.bottomNavigatorView);

? ? if (bottomNavigatorView != null) {

? ? ? ? bottomNavigatorView.setOnBottomNavigatorViewItemClickListener(this);//把實(shí)例對(duì)象傳給了BottomNavigatorView

類中的接口OnBottomNavigatorViewItemClickListener

? ? }

? ? setCurrentTab(mNavigator.getCurrentPosition());

?? //注冊(cè)廣播

? ? BroadcastManager.register(this,mLoginStatusChangeReceiver, Action.LOGIN, Action.LOGOUT);

}

其中做了三件很重要的事情:

1吓坚、設(shè)置tab的默認(rèn)位置

2撵幽、創(chuàng)建BottomNavigatorView類,并把當(dāng)前實(shí)例傳給BottomNavigatorView的接口OnBottomNavigatorViewItemClickListener礁击,

3盐杂、注冊(cè)廣播(類似iOS開(kāi)發(fā)中的NSNotificationCenter),register可以傳字符串?dāng)?shù)組哆窿,用于登錄后頁(yè)面的切換跳轉(zhuǎn)况褪,數(shù)據(jù)的存儲(chǔ)。

接口interface定義onBottomNavigatorViewItemClick方法:

public interface OnBottomNavigatorViewItemClickListener {

? ? void onBottomNavigatorViewItemClick(int position, View view);

}

其中Java的interface類似iOS中的協(xié)議Protocol(代理Delegete)

4更耻、廣播的創(chuàng)建與接收测垛,BroadcastReceiver是一個(gè)abstract

抽象類

private BroadcastReceivermLoginStatusChangeReceiver =new BroadcastReceiver() {

? ? @Override//接受廣播回調(diào)

? ? public void onReceive(Context context, Intent intent) {

? ? ? ? String action = intent.getAction();

? ? ? ? if (!TextUtils.isEmpty(action)) {

? ? ? ? ? ? int position = intent.getIntExtra("EXTRA_POSITION", -1);

? ? ? ? ? ? if (action.equals(Action.LOGIN)) {

? ? ? ? ? ? ? ? onUserLogin(position);

? ? ? ? ? ? }else if (action.equals(Action.LOGOUT)) {

? ? ? ? ? ? ? ? onUserLogout(position);

? ? ? ? ? ? }

? ? ? ? }

? ? }

};

控制器銷毀時(shí)要移除廣播的注冊(cè)unregister

@Override

protected void onDestroy() {

? ? BroadcastManager.unregister(this,mLoginStatusChangeReceiver);

? ? super.onDestroy();

}

如何在XML文件中引入Java類名 <com.aspsine.fragmentnavigator.demo.ui.widget.BottomNavigatorView

<?xml version="1.0" encoding="utf-8"?>

<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=".ui.activity.MainActivity">

? ? <FrameLayout

? ? ? ? android:id="@+id/container"

? ? ? ? android:layout_width="match_parent"

? ? ? ? android:layout_height="0dp"

? ? ? ? android:layout_weight="1" />

? ? <com.aspsine.fragmentnavigator.demo.ui.widget.BottomNavigatorView

? ? ? ? android:id="@+id/bottomNavigatorView"

? ? ? ? android:layout_width="match_parent"

? ? ? ? android:layout_height="56dp"

? ? ? ? android:clipToPadding="false"

? ? ? ? android:background="@android:color/white"

? ? ? ? android:elevation="8dp" />

</LinearLayout>



另外提醒:作者封裝了兩個(gè)類在library文件夾中:FragmentNavigator、接口?FragmentNavigatorAdapter

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末秧均,一起剝皮案震驚了整個(gè)濱河市食侮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌目胡,老刑警劉巖锯七,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異誉己,居然都是意外死亡眉尸,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén)巨双,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)噪猾,“玉大人,你說(shuō)我怎么就攤上這事筑累「だ” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵慢宗,是天一觀的道長(zhǎng)坪蚁。 經(jīng)常有香客問(wèn)我奔穿,道長(zhǎng),這世上最難降的妖魔是什么敏晤? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任贱田,我火速辦了婚禮,結(jié)果婚禮上嘴脾,老公的妹妹穿的比我還像新娘湘换。我一直安慰自己,他們只是感情好统阿,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著筹我,像睡著了一般扶平。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蔬蕊,一...
    開(kāi)封第一講書(shū)人閱讀 49,741評(píng)論 1 289
  • 那天结澄,我揣著相機(jī)與錄音,去河邊找鬼岸夯。 笑死麻献,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的猜扮。 我是一名探鬼主播勉吻,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼旅赢!你這毒婦竟也來(lái)了齿桃?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤煮盼,失蹤者是張志新(化名)和其女友劉穎短纵,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體僵控,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡香到,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了报破。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片悠就。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖充易,靈堂內(nèi)的尸體忽然破棺而出理卑,到底是詐尸還是另有隱情,我是刑警寧澤蔽氨,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布藐唠,位于F島的核電站帆疟,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏宇立。R本人自食惡果不足惜踪宠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望妈嘹。 院中可真熱鬧柳琢,春花似錦、人聲如沸润脸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)毙驯。三九已至倒堕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間爆价,已是汗流浹背垦巴。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留铭段,地道東北人骤宣。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像序愚,于是被迫代替她去往敵國(guó)和親憔披。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

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