【移动应用开发技术】a​n​d​r​o​i​d​4.x新​特​征​总​结_第1页
【移动应用开发技术】a​n​d​r​o​i​d​4.x新​特​征​总​结_第2页
【移动应用开发技术】a​n​d​r​o​i​d​4.x新​特​征​总​结_第3页
【移动应用开发技术】a​n​d​r​o​i​d​4.x新​特​征​总​结_第4页
【移动应用开发技术】a​n​d​r​o​i​d​4.x新​特​征​总​结_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【移动应用开发技术】a​n​d​r​o​i​d​4.x新​特​征​总​结

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

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

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

<?xmlversion="1.0"encoding="utf-8"?>

<LinearLayout

xmlns:android="/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="/apk/res/android"

xmlns:tools="/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中的内部类删除,这些类都是继承importandroid.support.v4.app.Fragment;

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

你可以右键空白处,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="/apk/res/android"

xmlns:app="/apk/res-auto"

xmlns:tools="/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)));

}在对于的a

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论