GooglePlay项目第一天笔记

GooglePlay项目第一天笔记,主要介绍了ActionBar的使用,以及DrawerLayout 抽屉菜单的实现等。

ActionBar

  • 从 Android3.0 开始谷歌推荐使用
  • 这里暂时不讨论低版本兼容问题
  • Eclipse
    1. 引用v7-appcompat
    2. Activity继承ActionBarActivity
    3. android:theme=”@style/Theme.AppCompat.Light” >
  • AS
    1. AS中的SDK是最新的,默认是继承了ActionBarAtivity,所以不用引入v7库
    2. Activity继承ActionBarActivity
    3. android:theme=”@style/Theme.AppCompat.Light”

      ActionBar中的搜索按钮

  • Eclipse

    1. 在menu目录下添加如下代码
    2. <menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:dongxi="http://schemas.android.com/apk/res-auto">
      <!-- Search, should appear as action button -->
      <item android:id="@+id/action_search"
      android:icon="@drawable/ic_action_search"
      android:title="@string/action_search"
      dongxi:showAsAction="ifRoom"
      dongxi:actionViewClass="android.support.v7.widget.SearchView"
      />
      </menu>
      
    3. 在继承ActionBar的类中实现以下方法
    4. /* 处理actionBar菜单条目的点击事件 /

      public boolean onOptionsItemSelected(MenuItem item) {
      if (item.getItemId() == R.id.action_search) {
      Toast.makeText(getApplicationContext(), "搜索", Toast.LENGTH_SHORT).show();
      }
      return drawerToggle.onOptionsItemSelected(item)|super.onOptionsItemSelected(item);
      }
      
      // 当搜索提交的时候
      @Override
      public boolean onQueryTextSubmit(String query) {
      Toast.makeText(getApplicationContext(), query, Toast.LENGTH_SHORT).show();
      return true;
      }
      // 当搜索的文本发生变化
      @Override
      public boolean onQueryTextChange(String newText) {
      return true;
      }      
      
  • AS

    • 由于AS中没有menu目录,所以需要在res下创建一个menu目录
    • 实现步骤同Eclipse,这里就不重复写了

ActionBar中返回按钮的处理(AS)

  • 在activity中处理

    • 添加如下代码
      actionBar = getSupportActionBar();//可以向下兼容
      1
      2
      actionBar.setDisplayHomeAsUpEnabled(true);//设置图片显示
      actionBar.setHomeButtonEnabled(true);//设置图片可以点击
  • 在AndroidManifest文件中处理

    android:name=".DetailActivity"
    1
    2
    3
    4
    5
    6
    7
    8
    	android:label="@string/app_detail"
    android:parentActivityName=".MainActivity"> //返回的上一个Activity

    <meta-data
    android:name="android.support.PARENT_ACTIVITY"
    android:value=".MainActivity"
    />
    </activity>

ActionBar Tab标签的实现

  • 在drawable目录下新建一个标签的状态选择器

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">

    <!-- 标签没被选中的样式 -->

    <!-- Non focused states -->
    <item android:state_focused="false" android:state_selected="false"
    android:state_pressed="false"
    android:drawable="@drawable/tab_unselected" />
    <item android:state_focused="false" android:state_selected="true"
    android:state_pressed="false"
    android:drawable="@drawable/tab_selected" />

    <!-- Focused states (such as when focused with a d-pad or mouse hover) -->
    <item android:state_focused="true" android:state_selected="false"
    android:state_pressed="false"
    android:drawable="@drawable/tab_unselected_focused" />
    <item android:state_focused="true" android:state_selected="true"
    android:state_pressed="false"
    android:drawable="@drawable/tab_selected_focused" />

    <!-- 标签被选中的样式 -->

    <!-- 非聚焦状态 -->
    <item android:state_focused="false" android:state_selected="false"
    android:state_pressed="true"
    android:drawable="@drawable/tab_unselected_pressed" />
    <item android:state_focused="false" android:state_selected="true"
    android:state_pressed="true"
    android:drawable="@drawable/tab_selected_pressed" />

    <!-- 聚焦状态 (例如当用方向键或鼠标悬停于) -->
    <item android:state_focused="true" android:state_selected="false"
    android:state_pressed="true"
    android:drawable="@drawable/tab_unselected_pressed" />
    <item android:state_focused="true" android:state_selected="true"
    android:state_pressed="true"
    android:drawable="@drawable/tab_selected_pressed" />
    </selector>
  • 实现自定义主题

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <resources>
    <style name="CustomActionBarTheme" //自定义主题名
    parent="@style/Theme.AppCompat.Light">//继承的ActionBar背景
    <item name="android:actionBarTabStyle">@style/MyActionBarTabs</item>

    <item name="actionBarTabStyle">@style/MyActionBarTabs</item>
    </style>
    <style name="MyActionBarTabs"
    parent="@style/Widget.AppCompat.ActionBar.TabView">
    <item name="android:background">@drawable/actionbar_tab_indicator</item>//状态选择器
    <item name="background">@drawable/actionbar_tab_indicator</item>
    </style>
    </resources>
  • 在代码里添加标签

    1
    2
    3
    4
    ActionBar actionBar = getSupportActionBar();
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    Tab tab1=actionBar.newTab().setText("标签一").setTabListener(new MyTabListener());
    actionBar.addTab(tab1);

DrawerLayout和SlidingMenu的对比

  • 抽屉菜单(DrawerLayout)优点
    • DrawerLayout稳定可靠,使用起来更简单一点;
  • 抽屉菜单(DrawerLayout)缺点
    • 个人见解不一定完全正确,欢迎指导
    • 抽屉的大小不好控制(据说可用ListView实现抽屉,可以参考官方文档)
  • 侧滑菜单的优点,缺点
    • 正好和DrawerLayout相反
  • 总结:
    • 根据不同情况使用不同的控件
    • SlidingMenu因为很容易实现的,而且好控制
    • DrawerLayout使用方便,代码实现较SlidingMenu简单

DrawerLayout 抽屉菜单的实现

  • 保证V4包下有这个类
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    <android.support.v4.widget.DrawerLayout 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=".MainActivity"
    android:id="@+id/dl">

    <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true"
    />

    <FrameLayout android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/bg_tab"
    android:layout_gravity="left">

    </FrameLayout>
    </android.support.v4.widget.DrawerLayout>

ActionBarDrawerToggle 抽屉菜单的开关

  • 控制抽屉的开关,在actionbar的上面
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    ActionBar actionBar = getSupportActionBar();
    actionBar.setDisplayHomeAsUpEnabled(true);
    actionBar.setHomeButtonEnabled(true);

    /*
    * 参数1)显示Navigation Drawer的 Activity 对象
    参数2) DrawerLayout 对象
    参数3)一个用来指示Navigation Drawer的 drawable资源
    参数4)一个用来描述打开Navigation Drawer的文本 (用于支持可访问性)。
    参数5)一个用来描述关闭Navigation Drawer的文本(用于支持可访问性).
    */
    drawerToggle = new ActionBarDrawerToggle(this,
    mDrawerLayout, R.drawable.ic_drawer_am, R.string.open_drawer,
    R.string.close_drawer);
    mDrawerLayout.setDrawerListener(drawerToggle);

    // 让开关和actionbar建立关系
    drawerToggle.syncState();

    /** 处理actionBar菜单条目的点击事件 */
    public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == R.id.action_search) {
    Toast.makeText(getApplicationContext(), "搜索", 0).show();
    }

    return drawerToggle.onOptionsItemSelected(item)|super.onOptionsItemSelected(item);
    }

BaseApplication extendes Application

  • 需要在AndroidManifest中配置
  • 添加这个属性 android:name=”BaseApplication”
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/CustomActionBarTheme" android:name="BaseApplication">//添加
    <activity android:name=".MainActivity">
    <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    </activity>
小额支持我写出更好的文章~