Android笔记一(Fragment和ActionBar的使用)
一直就想写写博客。把最近学到的新东西记录一下,方便以后的翻阅。IT技术的发展真的是日新月异,一些新的技术出来之后,一般要过很久才能在市面上买到相关的中文书籍。对于Android这样的移动平台来说,发展的速度更是相当迅速。现在市面能买到Android3.0以上的开发书籍真的很少。其实这完全没有必要的,只要你有良好的Java基础。学习Android开发,直接去看官方文档就OK了。那里才是最权威了。
从Android3.0开始,引用了Fragment这样一个新的东西,先来看下Fragment的定义:
A Fragment represents a behavior or a portion of user interface in an Activity. You can combine multiple fragments in a single activity to build a multi-pane UI and reuse a fragment in multiple activities. You can think of a fragment as a modular section of an activity, which has its own lifecycle, receives its own input events, and which you can add or remove while the activity is running (sort of like a "sub activity" that you can reuse in different activities).
其实说白了,就是Activity的一个子集。Fragment也有自己的生命周期,比Activity多出好几个。Fragment也可以使用layout.xml的文件来创建一个界面,但是不同于Activity,Fragment是通过在onCreateView中加载布局文件。
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.histories_list_layout, container,false);
}其中第二个参数container是指的父类视图,第三个参数是一个boolean值,它是值是否将其插入到父类界面中,该值一般为false,因为系统在inflate的时候,已经将它插入到了父类界面中,如果为true的话。它会重复插入父类界面。
在Fragment中也可以和Activity组建交互,例如获得一个Button,则可以通过findViewById()获得,不过要注意的是,必须通过getActivity()方法先获得该Fragment所在的Activity,而且必须在onActivityCreated()周期才能这样做。因为Fragment是先于Activity被创建的。如果在Fragment的onCreate()周期就去试图获取Activity组件的话,那样必定会报NullException。
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
editText = (EditText)getActivity().findViewById(R.id.edit);
listView = (ListView)getActivity().findViewById(R.id.histories_list);
}要在Activity中创建一个Fragment可以有两种方法,第一种是,在Activity的layout.xml布局文件中创建
<fragment class="com.wayne.searcher.SearchBar"
android:id="@+id/search_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>其中class必须指定到所要创建的Fragment类.当Activity加载其布局文件时,就是根据这个class自动生成这个类的时候,其实这种方式就像Spring里面的bean一样。第二种方式是在Activity中,通过FragmentManager管理一个Fragment。
HistoriesList historiesList = new HistoriesList(); FragmentTransaction t = getFragmentManager().beginTransaction(); t.add(R.id.contianer, historiesList); t.commit();
R.id.contianer是Activity的layout.xml文件的 <FrameLayout android:id="@+id/contianer"/>值。意思是将该Fragment加到container的位置。使用FragmentManager可以动态添加替换或者删除一个Fragment,从而实现 dynamic and flexible UI design。我觉得这一点更新是相当强大和实用的。可以使APP更加丰富。
t.replace(R.id.fragment_container, newFragment); t.addToBackStack(null); //将替换的Fragment放入一个栈中,按下返回键可以返回到之前的Fragment t.commit();
ActionBar也是在Android3.0中新引入的。实用ActionBar很简单,只要在Activity中加载其布局文件就可以
public boolean onCreateOptionsMenu(Menu menu) {
// 在这里加载布局文件
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_settings:
Intent intent = new Intent(this, Settings.class);
startActivity(intent);
return true;
default:
return super.onOptionsItemSelected(item);
}
}<!--R.menu.activity_main布局文件,放在menu目录下-->
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/menu_settings"
android:title="@string/menu_settings"
android:icon="@drawable/ic_menu_preferences"
android:showAsAction="ifRoom"/> <!--如果有空间就显示-->
<item
android:id="@+id/menu_about"
android:title="@string/menu_about"
android:showAsAction="ifRoom|withText"/>
</menu>ActionBar actionBar = getActionBar(); actionBar.setDisplayHomeAsUpEnabled(true); //返回导航
//ActionBar点击触发事件
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()) {
case android.R.id.home: //当点击的是返回导航键时
Intent intent = new Intent(this, Main.class);
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(intent);
this.finish();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
}