温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

a​n​d​r​o​i​d​4.x新​特​征​总​结

发布时间:2020-07-15 05:42:43 来源:网络 阅读:512 作者:天涯悬明月 栏目:移动开发

    Android新特征为了兼容老版本,改变了很多东西,这里先对几个重要的特征进行研究。


    第一,系统生成工程出现一个v7的东西,这个是兼容包,很多人觉得很不爽,忘了他把,这个是必要的,不能删除,工程要用到里面的v7扩展包和主题资源什么的,而且你用到fragment的话就必须要那个包里的主题!测试可以直接点中你要的工程进行测试就可以了,无需其他操作,和之前的一样!

    a​n​d​r​o​i​d​4.x新​特​征​总​结


    第二:系统默认的布局变成了两个,一个是main_activity和fragment_activity两个。这个是什么原因,main的布局默认是<fragment>根节点,fragment的布局是默认相对布局的,这个你可以随便改,线性布局,帧布局的都可以用,和我们之前用的main_activity是一样的,那他们有什么关系呢,其实这里要说一点,对于fragment有两种装载方式: 第一是布局装载,直接在布局中写入fragment节点,如下:

    

 <?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节点必须要有id,这样代码才能针对不同的id进行不同的装载。 

 第二是代码装载,就是官方提供的默认装载,如下:

 

<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进行代码装载,目测两种其实有不同,一个是针对一个页面多个fragment分块显示,一个是一个页面显示一个fragment,然后通过装载来切换! 

 

   这里我们简单总结一下fragment和一activity的区别:

   

    Activity的布局是一个容器,好比一个房间的整个空间,fragment好比是对其进行装修,你可以一个装修风格布满整个房间,也可以分开很多块分别专修,可以通过不同时候,显示不同灯光效果达到参观者(用户)看到不同表现。 

  

    既然谷歌选择默认后一种,我们就从这种开始研究,首先,我们看到MainActivity,发现大问题,不是继承了Activity,而是ActionBarActivity,这里又有新知识,(我是对fragment和actionbar不熟悉的,所以我觉得是新知识),actionbaractivity和activity有什么区别呢? 

   百度是这样回答的:AndroidBarActivity是支持库里的类可以兼容2.x版本 activity提供的actionbar只有在3.0以上才可以用.

   显然这个答案太抽象,现在我们先完成fragment的显示切换,然后在修改使得他通过actionbar进行切换。

  

完成fragment布局切换: 

1,在manifest文件中的application节点修改主题:

 

<application 
        android:allowBackup="true" 
        android:icon="@drawable/ic_launcher"         
        android:label="@string/app_name" 
        android:theme="@style/Theme.AppCompat.Light" >

  貌似都要用appcompat下的主题才行!当然你可以针对activity节点进行修改,我这样一劳永逸。 

2,新建多一个fragment_main布局,内容可以随意, 

3,新建两个类,你可以将系统默认里面生产的类拷贝出来,然后在新建类中粘帖上去,把原来mainactivity中的内部类删除,这些类都是继承import android.support.v4.app.Fragment; 

至于fragment的类要怎么写,先给出fragment的生命周期 

a​n​d​r​o​i​d​4.x新​特​征​总​结

        a​n​d​r​o​i​d​4.x新​特​征​总​结

你可以右键空白处,source,然后Override选项查看有那些可覆写的方法,这个给个例子

public class PlaceholderFragment extends Fragment {  

     public TextView text;  
     SendDateToActivity sdta; 
     public PlaceholderFragment() {  
     } 

      @Override 
      public void onAttach(Activity activity) {   
          super.onAttach(activity);   
          try{ 
               //这里进行绑定实现,如果activity没有实现对应办法,则会出错!    
               sdta=(SendDateToActivity)activity;   
          }catch(ClassCastException e){    
         
          } 
      } 
      
     @Override 
     public void onStart() { 
        //所有在frame布局中定义的控件都需要在oncreateview这个方法执行后实例 
        //化,最好在这里就可以了,否则死了都不知道什么回事! 
        text=(TextView)getActivity().findViewById(R.id.fragment1t1); 
        //这里进行调用 
        text.setText(sdta.setEditText());   
        super.onStart();  
     }
     
     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container,   
                    Bundle savedInstanceState) { 
             //这个方法进行装载fragment,  
             View rootView = inflater.inflate(R.layout.fragment_main,container,false);                return rootView;  
     } 
     //这是一个接口,对应的实现写在activity中,实现对应的方法,这样,这里就可以调用activity中的方法,实现数据传递。 
      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) { 
                //这里预先装载了一个fragment进行显示。 
                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;  
          }
          //这里进行按钮选择  @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>

   这样就实现了按菜单按钮实现fragment切换,按fragment2中的按钮可以实现参数传递到另一个fragment进行显示, 

这里完成了fragment切换及其参数传递的功能,这样面对新的默认布局,我们也能从容面对了。 

 可是还有一个问题就actionbar,首先明白actionbar是什么,顾名思义就是action的一个bar,也就是动作的点击按钮之类的!可以这么理解吧!Csdn有人这么归纳:

  

    通过查资料,最后实现了通过actionbar进行页面切换,下拉导航,标签页切换fragment,第四第五个还不知道什么意思,毕竟也是初次接触。大神请忽略这篇文档! 

其实要实现actionbar,需要做以下几件事, 

    1,就是你的activity必须是以android:theme="@style/Theme.AppCompat.Light"为主题,或者继承它的自定义主题 

    2,必须要显示标题栏,不可设置为无标题栏显示状态,网上有方法说可以解决,但是试过不行,有待研究, 

    3,如果要在底部出现菜单栏请在对于的activity节点中加入如下:                        android:uiOptions="splitActionBarWhenNarrow" 


    4,对于要显示的item一般和系统的meun写法一样,只不过多一个android:showAsAction="never"  建议这个属性用代码实现,因为很容易出现没效果的,如之前onCreateOptionsMenu方法中的代码所示 

    5,对于MenuItemCompat.SHOW_AS_ACTION_ALWAYS,后面的为参数有5,6种类型,可以直接百度,具体是用来控制bar显示还是隐藏的相关属性,不同属性有不同表现方式! 

    6,对于显示下拉列表功能则是通过如下代码实现

   

PopupMenu mPopupMenu=null; 
case R.id.myselfitem:  //这个为监听的按钮,也可是一个bar          
if (mPopupMenu == null) {   
             mPopupMenu = new PopupMenu(this,                        
             findViewById(R.id.myselfitem));  //这个id为按钮id 
             mPopupMenu.inflate(R.menu.mymeun);   
             //此时所在类要实现OnMenuItemClickListener,然后在接口中获取item的id,根据id 
             //进行响应即可         
             mPopupMenu.setOnMenuItemClickListener(this);          
}   
mPopupMenu.show();   
return true;


对应布局很简单 

和系统的meun写法一样的!自己去定义, 

   7,标签页现在应该都是统一用actionbar来实现了,而不是用之前的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函数中如上代码,然后写一个tablistener的内部类 

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;  
  }

即可实现标签页的效果! 

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI