第五章 用戶界面基礎(chǔ)(操作欄與Fragment)

參考資料:
《Android應(yīng)用程序開發(fā)》ISBN 9787302283164
參考軟件:
Android Studio、Eclipse+ADT、Android SDK、JDK
操作欄與Fragment

操作欄ActionBar
一、ActionBar介紹
ActionBar是位于Activity頂部,用于顯示Activity的圖標(biāo),標(biāo)題,以及菜單的??捎糜趯?dǎo)航等功能,廣泛應(yīng)用于View的交互。ActionBar可分為三部分,分別是第一Icon、第二Item、第三overflow按鈕。如圖

二、如何添加ActionBar。
(ActionBar 是在Android?3.0(API11)中加入到SK中的,想在低版本中使用ActionBar使用Support Library v7。)
1、新建activity繼承自AppCompatActivty.
package?com.example.ch06;
?import?android.app.ActionBar;
?import?android.support.v7.app.AppCompatActivity;
?import?android.os.Bundle;
?public class?MainActivity?extends?AppCompatActivity {
?????@Override
?????protected void?onCreate(Bundle savedInstanceState) {
?????????super.onCreate(savedInstanceState);
???????? setContentView(R.layout.activity_main);??????? ?
???? }
?}
?2、實(shí)現(xiàn)Theme.AppCompat.Light.DarkActionBar主題?
<?xml version="1.0"?encoding="utf-8"?>
?<manifest?xmlns:android="http://schemas.android.com/apk/res/android" ?package="com.example.ch06">
???? <application?android:allowBackup="true" ?android:icon="@mipmap/ic_launcher"
?????????android:label="@string/app_name" ?android:roundIcon="@mipmap/ic_launcher_round"
?????????android:supportsRtl="true" ?android:theme="@style/AppTheme">
???????? <activity?android:name=".MainActivity">
???????????? <intent-filter>
???????????????? <action?android:name="android.intent.action.MAIN" ?/>
???????????????? <category?android:name="android.intent.category.LAUNCHER" ?/>
???????????? </intent-filter>
???????? </activity>
???? </application>
?</manifest>
3、下面為大家圖解一下theme主題配置文件中的樣式都有哪些,前人總結(jié)的。

4、最終效果圖如下

三、移除ActionBar。
android.support.v7.app.ActionBar actionBar = getSupportActionBar();
?actionBar.hide();
四、修改actionBar的樣式圖標(biāo)
ActionBar的標(biāo)題默認(rèn)是繼承了Applicition和Activity的lable屬性,所以只需要修改activity的lable屬性即可。值得一提的是,老的版本中修改icon也是默認(rèn)繼承自logo屬性,但是發(fā)現(xiàn)前段時(shí)間更新之后就無法顯示了,需要代碼中設(shè)定。?
//得到actionBar,注意我的是V7包,使用getSupportActionBar()
?android.support.v7.app.ActionBar ?actionBar = getSupportActionBar();
?//在使用v7包的時(shí)候顯示icon和標(biāo)題需指定一下屬性。
?actionBar.setDisplayShowHomeEnabled(true);
?actionBar.setLogo(R.mipmap.ic_launcher);
?actionBar.setDisplayUseLogoEnabled(true);
?setContentView(R.layout.activity_main);
五、添加item和overfloy。
1、把所有的action item定義在menu的資源文件中。showAsAction(此item如何顯示在actionBar上) icon(圖標(biāo))title(標(biāo)題)。showAsAction屬性,never不顯示在actionBar上,ifRoom如果有空間就顯示,沒空間就顯示在overflow上,always只顯示在actionbar上。
<?xml version="1.0"?encoding="utf-8"?>
?<menu?xmlns:android="http://schemas.android.com/apk/res/android"
?????xmlns:app="http://schemas.android.com/apk/res-auto">
???? <item
?????????android:id="@+id/create_new"
?????????app:showAsAction="always"
?????????android:title="新建文件">
???? </item>
???? <item
?????????android:id="@+id/open"
?????????app:showAsAction="always"
?????????android:title="打開文件"/>
?</menu>
2、在activity中引用資源文件。
package?com.example.ch06;
?import?android.app.ActionBar;
?import?android.support.v7.app.AppCompatActivity;
?import?android.os.Bundle;
?import?android.view.Menu;
?import?android.view.MenuInflater;
?import?android.view.MenuItem;
?import?android.widget.Toast;
?
?public class?MainActivity?extends?AppCompatActivity {
?
?????@Override
?????protected void?onCreate(Bundle savedInstanceState) {
?????????super.onCreate(savedInstanceState);
?????????//得到actionBar,注意我的是V7包,使用getSupportActionBar()
?????????android.support.v7.app.ActionBar actionBar = ?getSupportActionBar();
?????????//在使用v7包的時(shí)候顯示icon和標(biāo)題需指定一下屬性。
?????????actionBar.setDisplayShowHomeEnabled(true);
???????? actionBar.setLogo(R.mipmap.ic_launcher);
???????? ?actionBar.setDisplayUseLogoEnabled(true);
???????? setContentView(R.layout.activity_main);
?
???? }
??? ?/**
????? *?@param?menu
??????*?@return
??????*?使用菜單
????? */
?????@Override
?????public boolean?onCreateOptionsMenu(Menu menu) {
???????? MenuInflater inflater = ?getMenuInflater();
???????? inflater.inflate(R.menu.mainmenu, menu);
?????????return super.onCreateOptionsMenu(menu);
???? }
?
?????/**
????? *?@param?item
??????*?@return
??????* item的點(diǎn)擊事件
????? */
?????@Override
?????public boolean?onOptionsItemSelected(MenuItem item) {
?????????switch?(item.getItemId()) {
?????????????// action with ID action_refresh was selected
?????????????case?R.id.create_new:
???????????????? Toast.makeText(this,?"刪除", Toast.LENGTH_SHORT).show();
?????????????????break;
?????????????// action with ID action_settings was selected
?????????????case?R.id.open:
???????????????? Toast.makeText(this,?"添加", Toast.LENGTH_SHORT).show();
?????????????????break;
?????????????default:
?????????????????break;
???????? }
?????????return super.onOptionsItemSelected(item);
???? }
?
?}

六、使用自定義的view添加到actionBar上
1、自定義layout_actionbar.xml
<?xml version="1.0"?encoding="utf-8"?>
?<LinearLayout?xmlns:android="http://schemas.android.com/apk/res/android"
?????android:layout_width="match_parent" ?android:layout_height="match_parent">
???? <ImageButton?android:id="@+id/left_imbt"
?????????android:layout_width="wrap_content"
?????????android:layout_height="wrap_content"
?????????android:background="@mipmap/ic_launcher"></ImageButton>
???????? <TextView?android:id="@+id/bar_title"
?????????????android:layout_width="wrap_content"
?????????????android:layout_height="wrap_content"
?????????????android:textColor="#FFFFFFFF"
?????????????android:textSize="18sp"
?????????????android:text="標(biāo)題"> </TextView>
???????????? <TextView?android:id="@+id/right_bt"
?????????????????android:layout_width="wrap_content"
?????????????????android:layout_height="wrap_content"
?????????????????android:textSize="18sp"?android:background="@null"></TextView>
?</LinearLayout>
2、在activity中引用,并且得到控件
//顯示自定義的actionBar
?actionBar.setDisplayShowCustomEnabled(true);
?View actionbarLayout = LayoutInflater.from(this).inflate(R.layout.layout_actionbar,?null);
?actionBar.setCustomView(actionbarLayout);
?bar_title?= (TextView)actionbarLayout.findViewById(R.id.bar_title);
?right_bt?= (TextView)actionbarLayout.findViewById(R.id.right_bt);
?bar_title.setText("我的任務(wù)");
?right_bt.setText("篩選");
?bar_title.setTextColor(Color.WHITE);
?right_bt.setTextColor(Color.WHITE);
Fragment
http://www.cnblogs.com/terryblog/archive/2012/02/17/2355753.html
http://blog.csdn.net/guolin_blog/article/details/8881711
1、FragmentDemo示例


利用Fragment完成橫豎屏顯示不同內(nèi)容
一、layout/activity_main.xml
<?xml version="1.0"?encoding="utf-8"?>
?<LinearLayout?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"
?????android:layout_width="match_parent"
?????android:layout_height="match_parent"
?????android:orientation="horizontal"
?????android:id="@+id/content"
?????tools:context="com.example.ch05.MainActivity">
?</LinearLayout>
二、com.example.ch05.MainActivity
package?com.example.ch05;
?import?android.support.v7.app.AppCompatActivity;
?import?android.os.Bundle;
?import?android.view.Display;
?public class?MainActivity?extends?AppCompatActivity {
?????@Override
?????protected void?onCreate(Bundle savedInstanceState) {
?????????super.onCreate(savedInstanceState);
???????? setContentView(R.layout.activity_main);
???????? Display defaultDisplay = ?getWindowManager().getDefaultDisplay();
?????????if(defaultDisplay.getWidth()>defaultDisplay.getHeight()){
???????????? Fragment1 fragment1 =?new?Fragment1();
???????????? ?getFragmentManager().beginTransaction().replace(R.id.content,fragment1).commit();
???????? }else{
???????????? Fragment2 fragment2 =?new?Fragment2();
???????????? ?getFragmentManager().beginTransaction().replace(R.id.content,fragment2).commit();
???????? }
???? }
?}
三、Fragment
package?com.example.ch05;
?import?android.os.Bundle;
?import?android.app.Fragment;
?import?android.view.LayoutInflater;
?import?android.view.View;
?import?android.view.ViewGroup;
?/**
??* A simple {@link?Fragment} ?subclass.
??*/
?public class?Fragment1?extends?Fragment {
?????public?Fragment1() {
?????????// Required empty public constructor
?????}
?????@Override
?????public?View onCreateView(LayoutInflater inflater, ViewGroup container,
????????????????????????????? Bundle ?savedInstanceState) {
?????????// Inflate the layout for this fragment
??????? ?return?inflater.inflate(R.layout.fragment_fragment1, container,?false);
???? }
?}
四、Fragment Layout
<FrameLayout ?xmlns:android="http://schemas.android.com/apk/res/android"
?????xmlns:tools="http://schemas.android.com/tools"
?????android:layout_width="match_parent"
?????android:layout_height="match_parent"
?????tools:context="com.example.ch05.Fragment1">
?????<!--?TODO: Update blank fragment layout?-->
?????<TextView
?????????android:layout_width="match_parent"
?????????android:layout_height="match_parent"
?????????android:text="豎屏顯示"?/>
?</FrameLayout>