您好,登錄后才能下訂單哦!
Android新特征為了兼容老版本,改變了很多東西,這里先對幾個重要的特征進(jìn)行研究。
第一,系統(tǒng)生成工程出現(xiàn)一個v7的東西,這個是兼容包,很多人覺得很不爽,忘了他把,這個是必要的,不能刪除,工程要用到里面的v7擴(kuò)展包和主題資源什么的,而且你用到fragment的話就必須要那個包里的主題!測試可以直接點(diǎn)中你要的工程進(jìn)行測試就可以了,無需其他操作,和之前的一樣!
第二:系統(tǒng)默認(rèn)的布局變成了兩個,一個是main_activity和fragment_activity兩個。這個是什么原因,main的布局默認(rèn)是<fragment>根節(jié)點(diǎn),fragment的布局是默認(rèn)相對布局的,這個你可以隨便改,線性布局,幀布局的都可以用,和我們之前用的main_activity是一樣的,那他們有什么關(guān)系呢,其實(shí)這里要說一點(diǎn),對于fragment有兩種裝載方式: 第一是布局裝載,直接在布局中寫入fragment節(jié)點(diǎn),如下:
<?xmlversion="1.0"encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <fragment android:name="com.example.news.ArticleListFragment" android:id="@+id/list" android:layout_weight="1" android:layout_width="0dp" android:layout_height="match_parent"/> <fragment android:name="com.example.news.ArticleReaderFragment" android:id="@+id/viewer" android:layout_weight="2" android:layout_width="0dp" android:layout_height="match_parent"/> </LinearLayout>
這個fragment節(jié)點(diǎn)必須要有id,這樣代碼才能針對不同的id進(jìn)行不同的裝載。
第二是代碼裝載,就是官方提供的默認(rèn)裝載,如下:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="walleeva.android4_4_frame.MainActivity" tools:ignore="MergeRootFrame" />
然后通過framelayout 的id進(jìn)行代碼裝載,目測兩種其實(shí)有不同,一個是針對一個頁面多個fragment分塊顯示,一個是一個頁面顯示一個fragment,然后通過裝載來切換!
這里我們簡單總結(jié)一下fragment和一activity的區(qū)別:
Activity的布局是一個容器,好比一個房間的整個空間,fragment好比是對其進(jìn)行裝修,你可以一個裝修風(fēng)格布滿整個房間,也可以分開很多塊分別專修,可以通過不同時候,顯示不同燈光效果達(dá)到參觀者(用戶)看到不同表現(xiàn)。
既然谷歌選擇默認(rèn)后一種,我們就從這種開始研究,首先,我們看到MainActivity,發(fā)現(xiàn)大問題,不是繼承了Activity,而是ActionBarActivity,這里又有新知識,(我是對fragment和actionbar不熟悉的,所以我覺得是新知識),actionbaractivity和activity有什么區(qū)別呢?
百度是這樣回答的:AndroidBarActivity是支持庫里的類可以兼容2.x版本 activity提供的actionbar只有在3.0以上才可以用.
顯然這個答案太抽象,現(xiàn)在我們先完成fragment的顯示切換,然后在修改使得他通過actionbar進(jìn)行切換。
完成fragment布局切換:
1,在manifest文件中的application節(jié)點(diǎn)修改主題:
<application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/Theme.AppCompat.Light" >
貌似都要用appcompat下的主題才行!當(dāng)然你可以針對activity節(jié)點(diǎn)進(jìn)行修改,我這樣一勞永逸。
2,新建多一個fragment_main布局,內(nèi)容可以隨意,
3,新建兩個類,你可以將系統(tǒng)默認(rèn)里面生產(chǎn)的類拷貝出來,然后在新建類中粘帖上去,把原來mainactivity中的內(nèi)部類刪除,這些類都是繼承import android.support.v4.app.Fragment;
至于fragment的類要怎么寫,先給出fragment的生命周期
你可以右鍵空白處,source,然后Override選項(xiàng)查看有那些可覆寫的方法,這個給個例子
public class PlaceholderFragment extends Fragment { public TextView text; SendDateToActivity sdta; public PlaceholderFragment() { } @Override public void onAttach(Activity activity) { super.onAttach(activity); try{ //這里進(jìn)行綁定實(shí)現(xiàn),如果activity沒有實(shí)現(xiàn)對應(yīng)辦法,則會出錯! sdta=(SendDateToActivity)activity; }catch(ClassCastException e){ } } @Override public void onStart() { //所有在frame布局中定義的控件都需要在oncreateview這個方法執(zhí)行后實(shí)例 //化,最好在這里就可以了,否則死了都不知道什么回事! text=(TextView)getActivity().findViewById(R.id.fragment1t1); //這里進(jìn)行調(diào)用 text.setText(sdta.setEditText()); super.onStart(); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { //這個方法進(jìn)行裝載fragment, View rootView = inflater.inflate(R.layout.fragment_main,container,false); return rootView; } //這是一個接口,對應(yīng)的實(shí)現(xiàn)寫在activity中,實(shí)現(xiàn)對應(yīng)的方法,這樣,這里就可以調(diào)用activity中的方法,實(shí)現(xiàn)數(shù)據(jù)傳遞。 public interface SendDateToActivity{ public String setEditText(); } }
這里是mainactivity的源代碼,一起貼出來
public class MainActivity extends ActionBarActivity implements SendDateToActivity,SendDateToActivity2{ public String edittext; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); if (savedInstanceState == null) { //這里預(yù)先裝載了一個fragment進(jìn)行顯示。 getSupportFragmentManager().beginTransaction().add(R.id.container, new PlaceholderFragment2()).commit(); } } @Override public boolean onCreateOptionsMenu(Menu menu) { //這里定義了兩個按鈕 MenuInflater menuInflater = getMenuInflater(); menuInflater.inflate(R.menu.main, menu); MenuItem menuItem = menu.findItem(R.id.action_search); MenuItem findItem = menu.findItem(R.id.action_compose); MenuItemCompat.setShowAsAction(menuItem, MenuItemCompat.SHOW_AS_ACTION_ALWAYS); MenuItemCompat.setShowAsAction(findItem, MenuItemCompat.SHOW_AS_ACTION_ALWAYS); return true; } //這里進(jìn)行按鈕選擇 @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.action_compose) { getSupportFragmentManager().beginTransaction().replace(R.id.container, new PlaceholderFragment()).commit(); return true; }else if(id == R.id.action_search){ getSupportFragmentManager().beginTransaction().replace(R.id.container, new PlaceholderFragment2()).commit(); return true; } return super.onOptionsItemSelected(item); } }
菜單布局如下:
<menu 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" tools:context="walleeva.android4_4_frame.MainActivity"> <item android:id="@+id/action_search" android:icon="@drawable/abc_ic_clear" android:title="@string/action_settings"/> <item android:id="@+id/action_compose" android:icon="@drawable/abc_ic_go" android:title="@string/abc_activity_chooser_view_see_all"/> </menu>
這樣就實(shí)現(xiàn)了按菜單按鈕實(shí)現(xiàn)fragment切換,按fragment2中的按鈕可以實(shí)現(xiàn)參數(shù)傳遞到另一個fragment進(jìn)行顯示,
這里完成了fragment切換及其參數(shù)傳遞的功能,這樣面對新的默認(rèn)布局,我們也能從容面對了。
可是還有一個問題就actionbar,首先明白actionbar是什么,顧名思義就是action的一個bar,也就是動作的點(diǎn)擊按鈕之類的!可以這么理解吧!Csdn有人這么歸納:
通過查資料,最后實(shí)現(xiàn)了通過actionbar進(jìn)行頁面切換,下拉導(dǎo)航,標(biāo)簽頁切換fragment,第四第五個還不知道什么意思,畢竟也是初次接觸。大神請忽略這篇文檔!
其實(shí)要實(shí)現(xiàn)actionbar,需要做以下幾件事,
1,就是你的activity必須是以android:theme="@style/Theme.AppCompat.Light"為主題,或者繼承它的自定義主題
2,必須要顯示標(biāo)題欄,不可設(shè)置為無標(biāo)題欄顯示狀態(tài),網(wǎng)上有方法說可以解決,但是試過不行,有待研究,
3,如果要在底部出現(xiàn)菜單欄請在對于的activity節(jié)點(diǎn)中加入如下: android:uiOptions="splitActionBarWhenNarrow"
4,對于要顯示的item一般和系統(tǒng)的meun寫法一樣,只不過多一個android:showAsAction="never" 建議這個屬性用代碼實(shí)現(xiàn),因?yàn)楹苋菀壮霈F(xiàn)沒效果的,如之前onCreateOptionsMenu方法中的代碼所示
5,對于MenuItemCompat.SHOW_AS_ACTION_ALWAYS,后面的為參數(shù)有5,6種類型,可以直接百度,具體是用來控制bar顯示還是隱藏的相關(guān)屬性,不同屬性有不同表現(xiàn)方式!
6,對于顯示下拉列表功能則是通過如下代碼實(shí)現(xiàn)
PopupMenu mPopupMenu=null; case R.id.myselfitem: //這個為監(jiān)聽的按鈕,也可是一個bar if (mPopupMenu == null) { mPopupMenu = new PopupMenu(this, findViewById(R.id.myselfitem)); //這個id為按鈕id mPopupMenu.inflate(R.menu.mymeun); //此時所在類要實(shí)現(xiàn)OnMenuItemClickListener,然后在接口中獲取item的id,根據(jù)id //進(jìn)行響應(yīng)即可 mPopupMenu.setOnMenuItemClickListener(this); } mPopupMenu.show(); return true;
對應(yīng)布局很簡單
和系統(tǒng)的meun寫法一樣的!自己去定義,
7,標(biāo)簽頁現(xiàn)在應(yīng)該都是統(tǒng)一用actionbar來實(shí)現(xiàn)了,而不是用之前的tabhost,actionbar完成可以通過控制不同的fragment顯示,具體代碼如下:
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_theme_holo); getActionBar().setDisplayHomeAsUpEnabled(true); getActionBar().setHomeButtonEnabled(true); final ActionBar actionBar = getSupportActionBar(); //提示getActionBar方法一定在setContentView后面 actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); actionBar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE); Fragment artistsFragment = new PlaceholderFragment(); actionBar.addTab(actionBar.newTab().setText("first").setTabListener( new MyTabListener(artistsFragment))); Fragment albumsFragment = new PlaceholderFragment2(); actionBar.addTab(actionBar.newTab().setText("second").setTabListener( new MyTabListener(albumsFragment))); }
在對于的activity中的oncreate函數(shù)中如上代碼,然后寫一個tablistener的內(nèi)部類
private class MyTabListener implements ActionBar.TabListener { private Fragment mFragment; public MyTabListener(Fragment fragment) { mFragment = fragment; } @Override public void onTabSelected(Tab tab, FragmentTransaction ft) { ft.add(R.id.container2, mFragment, null); } @Override public void onTabUnselected(Tab tab, FragmentTransaction ft) { ft.remove(mFragment); } @Override public void onTabReselected(Tab tab, FragmentTransaction ft) { } } @Override public boolean onMenuItemClick(MenuItem arg0) { int id=arg0.getItemId(); if(id==R.id.action_search3){ System.out.println("search3"); }else if(id==R.id.action_compose2){ System.out.println("action_compose2"); } return false; }
即可實(shí)現(xiàn)標(biāo)簽頁的效果!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。