溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

a​n​d​r​o​i​d​4.x新​特​征​總​結(jié)

發(fā)布時間:2020-07-15 05:42:43 來源:網(wǎng)絡(luò) 閱讀:512 作者:天涯懸明月 欄目:移動開發(fā)

    Android新特征為了兼容老版本,改變了很多東西,這里先對幾個重要的特征進(jìn)行研究。


    第一,系統(tǒng)生成工程出現(xiàn)一個v7的東西,這個是兼容包,很多人覺得很不爽,忘了他把,這個是必要的,不能刪除,工程要用到里面的v7擴(kuò)展包和主題資源什么的,而且你用到fragment的話就必須要那個包里的主題!測試可以直接點(diǎn)中你要的工程進(jìn)行測試就可以了,無需其他操作,和之前的一樣!

    a​n​d​r​o​i​d​4.x新​特​征​總​結(jié)


    第二:系統(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的生命周期 

a​n​d​r​o​i​d​4.x新​特​征​總​結(jié)

        a​n​d​r​o​i​d​4.x新​特​征​總​結(jié)

你可以右鍵空白處,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)簽頁的效果! 

向AI問一下細(xì)節(jié)

免責(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)容。

AI