分享

【Android UI设计与开发】第12期:ActionBar实现层级导航的返回效果

 蠢驴不笨驴不蠢 2014-04-05
当用户触摸这个图标时,系统会调用Activity带有android.R.id.home ID的onOptionsItemSelected()方法。在这个响应中,你既可以启动主Activity,也可以返回你的应用程序结构化层次中用户上一步操作的界面。       如果你要通过应用程序图标的响应来返回主Activity,那么就应该在Itent对象中包括FLAG_ACTIVITY_CLEAR_TOP标识。用这个标记,如果你要启动的Activity在当前任务中已经存在,那么,堆栈中这个Activity之上的所有的Activity都有被销毁,并且把这个Activity显示给用户。添加这个标识往往是重要的,因为返回主Activity相当与一个回退的动作,因此通常不应该再创建一个新的主Activity的实例,否则,最终可能会在当前任务中产生一个很长的拥有多个主Activity的堆栈。例如,下例的onOptionsItemSelected()方法实现了返回应用程序的主Activity的操作:
  1. @Override
  2. public boolean onOptionsItemSelected(MenuItem item) {
  3.     switch (item.getItemId()) {
  4.         case android.R.id.home:
  5.             Intent intent = new Intent(this, HomeActivity.class);
  6.             intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
  7.             startActivity(intent);
  8.             return true;
  9.         default:
  10.             return super.onOptionsItemSelected(item);
  11.     }
  12. }
复制代码
在用户从另一个应用程序进入当前Activity的情况下,你可能还想要添加FLAG_ACTIVITY_NEW_TASK标识。这个标识确保在用户返回主页或上级页面时,新的Activity不会被添加到当前的任务中,而是在属于你自己的应用程序的任务中启动。例如,如果用户通过被另一个应用程序调用的Intent对象启动了你的应用程序中的一个Activity,那么选择操作栏图标来返回主页或上级页面时,FLAG_ACTIVITY_CLEAR_TOP标识会在属于你的应用程序的任务中启动这个Activity(不是当前任务)。系统既可以用这个新的Activity做根Activity来启动一个新的任务,也可以把存在后台的拥有这个Activity实例的一个既存任务带到前台来,并且目标Activity会接受onNewIntent()回调。因此,如果你的Activity要接收另一个应用程序的Intent对象,那么通常应该给这个Intent对象添加FLAG_ACTIVITY_NEW_TASK标识,如:
  1. @Override
  2. public boolean onOptionsItemSelected(MenuItem item) {
  3.     switch (item.getItemId()) {
  4.         case android.R.id.home:
  5.             // This is called when the Home (Up) button is pressed
  6.             // in the Action Bar.
  7.             Intent parentActivityIntent = new Intent(this, MyParentActivity.class);
  8.             parentActivityIntent.addFlags(
  9.                     Intent.FLAG_ACTIVITY_CLEAR_TOP |
  10.                     Intent.FLAG_ACTIVITY_NEW_TASK);
  11.             startActivity(parentActivityIntent);
  12.             finish();
  13.             return true;
  14.     }
  15.     return super.onOptionsItemSelected(item);
  16. }
复制代码
二、在Fragments中实现层级导航
              当在应用中使用fragments时,单一的FragmentTransaction对象能够表示环境的变化,应该被添加到back堆栈。例如,如果你要实现一个master/detail流程,通过换出fragments,你应该确保在detail界面上点击Back按钮回退到master界面。
  1. getFragmentManager().beginTransaction().add(detailFragment, "detail")
  2.           // Add this transaction to the back stack and commit.
  3.         .addToBackStack()
  4.         .commit();
复制代码
如果FragmentTransaction对象在back堆栈上,activity的FragmentManager会处理Back按钮的点击事件。当这一事件发生时,FragmentManager从back堆栈中弹出最近一次事务,并进行反向的行为。如果你的应用程序更新其他用户界面元素来反应当前fragment的状态,例如action bar,记得在commit事务的时候更新UI。
  1. getFragmentManager().addOnBackStackChangedListener(
  2.         new FragmentManager.OnBackStackChangedListener() {
  3.             public void onBackStackChanged() {
  4.                 // Update your UI here.
  5.             }
  6.         });
复制代码
三、导航到外部界面 当启动另一个应用程序的activity来允许用户,写一个邮件,或挑选一个照片附件,你一般不会想让用户在Launcher中重新启动程序时回到这个界面。这会对用户造成混淆。为了阻止这种事情的发生,简单的对intent添加FLAG_ACTIVITY_CLEAR_WITH_TASK_RESET标签来启动外部的activity:
  1. Intent externalActivityIntent = new Intent(Intent.ACTION_PICK);
  2. externalActivityIntent.setType("image/*");
  3. externalActivityIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
  4. startActivity(externalActivityIntent);
复制代码
四、实现的效果图
五、项目结构图 六、详细代码编写 1、这个项目的代码不多,首先是主布局页面,activity_main.xml:
  1. <RelativeLayout xmlns:android="http://schemas./apk/res/android"
  2.     xmlns:tools="http://schemas./tools"
  3.     android:layout_width="match_parent"
  4.     android:layout_height="match_parent">

  5.     <Button
  6.         android:id="@+id/other_btn"
  7.         android:layout_width="match_parent"
  8.         android:layout_height="wrap_content"
  9.         android:layout_centerHorizontal="true"
  10.         android:layout_marginTop="160dp"
  11.         android:text="Other_Activity" />

  12.     <Button
  13.         android:id="@+id/external_btn"
  14.         android:layout_width="match_parent"
  15.         android:layout_height="wrap_content"
  16.         android:layout_alignParentLeft="true"
  17.         android:layout_below="@+id/other_btn"
  18.         android:text="External_Activity" />

  19. </RelativeLayout>
复制代码
2、然后是另一个界面的布局,activity_other.xml:
  1. <RelativeLayout xmlns:android="http://schemas./apk/res/android"
  2.     xmlns:tools="http://schemas./tools"
  3.     android:layout_width="match_parent"
  4.     android:layout_height="match_parent">

  5. </RelativeLayout>
复制代码
3、主界面Activity类,MainActivity.java:
  1. package com.yangyu.myactionbar04;

  2. import android.app.ActionBar;
  3. import android.app.Activity;
  4. import android.content.Intent;
  5. import android.os.Bundle;
  6. import android.view.View;

  7. public class MainActivity extends Activity {

  8.         public void onCreate(Bundle savedInstanceState) {
  9.                 super.onCreate(savedInstanceState);
  10.                 setContentView(R.layout.activity_main);

  11.                 initView();
  12.         }

  13.         /**
  14.          * 初始化组件
  15.          */
  16.         private void initView(){
  17.                 final ActionBar actionBar = getActionBar();
  18.                
  19.                 actionBar.setHomeButtonEnabled(false);       
  20.                
  21.                 this.findViewById(R.id.other_btn).setOnClickListener(new View.OnClickListener() {
  22.             @Override
  23.             public void onClick(View view) {
  24.                 Intent intent = new Intent(MainActivity.this, OtherActivity.class);
  25.                 startActivity(intent);
  26.             }
  27.         });
  28.                
  29.                 this.findViewById(R.id.external_btn).setOnClickListener(new View.OnClickListener() {
  30.              @Override
  31.              public void onClick(View view) {      
  32.                      //调用图片浏览器
  33.                  Intent externalActivityIntent = new Intent(Intent.ACTION_PICK);
  34.                  externalActivityIntent.setType("image/*");
  35.                  externalActivityIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
  36.                  startActivity(externalActivityIntent);
  37.              }
  38.          });
  39.         }
  40. }

复制代码
4、进入到另一个Activity界面,OtherActivity.java:
  1. package com.yangyu.myactionbar04;

  2. import android.app.ActionBar;
  3. import android.content.Intent;
  4. import android.os.Bundle;
  5. import android.support.v4.app.FragmentActivity;
  6. import android.support.v4.app.NavUtils;
  7. import android.support.v4.app.TaskStackBuilder;
  8. import android.view.MenuItem;

  9. public class OtherActivity extends FragmentActivity {
  10.    
  11.     public void onCreate(Bundle savedInstanceState) {
  12.         super.onCreate(savedInstanceState);
  13.         setContentView(R.layout.activity_other);
  14.    
  15.         final ActionBar actionBar = getActionBar();
  16.       
  17.         actionBar.setDisplayHomeAsUpEnabled(true);
  18.     }

  19.     @Override
  20.     public boolean onOptionsItemSelected(MenuItem item) {
  21.         switch (item.getItemId()) {
  22.             case android.R.id.home:            
  23.                 Intent upIntent = new Intent(this, MainActivity.class);
  24.                 if (NavUtils.shouldUpRecreateTask(this, upIntent)) {                  
  25.                     TaskStackBuilder.from(this)
  26.                             //如果这里有很多原始的Activity,它们应该被添加在这里
  27.                             .addNextIntent(upIntent)
  28.                             .startActivities();
  29.                     finish();
  30.                 } else {                  
  31.                     NavUtils.navigateUpTo(this, upIntent);
  32.                 }
  33.                 return true;
  34.         }
  35.         return super.onOptionsItemSelected(item);
  36.     }

  37. }

复制代码
MyActionBar04.zip (202.07 KB, 下载次数: 128)

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多