这个demo演示了actionbar的各种布局样式。
activity_main.xml
<ScrollView 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" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="5dp" >
<Button
android:id="@+id/display_home_as_up"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="DISPLAY_HOME_AS_UP" />
<Button
android:id="@+id/display_show_home"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="DISPLAY_SHOW_HOME" />
<Button
android:id="@+id/display_use_loge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="DISPLAY_USE_LOGO" />
<Button
android:id="@+id/display_show_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="DISPLAY_SHOW_TITLE" />
<Button
android:id="@+id/display_show_custom"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="DISPLAY_SHOW_CUSTOM" />
<Button
android:id="@+id/navigation"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="NAVIGATION" />
<Button
android:id="@+id/cycle_custon_view_gravity"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Cycle Custon View Gravity" />
<Button
android:id="@+id/toggle_visibility"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Toggle Visibility" />
<Button
android:id="@+id/toggle_system_ui"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TOGGLE SYSTEM UI" />
</LinearLayout>
</ScrollView>
menu_item.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:id="@+id/menu_item"
android:title="Menu Title"
android:showAsAction="never"/>
</menu>
custom_view.xml
<?xml version="1.0" encoding="utf-8"?>
<Button xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Custon View" >
</Button>
配置文件中添加logo属性
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:logo="@drawable/apidemo_androidlogo">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
MainActivity
@SuppressWarnings("deprecation")
public class MainActivity extends Activity implements OnClickListener,
TabListener {
private View mCustomView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.display_home_as_up).setOnClickListener(this);
findViewById(R.id.display_show_home).setOnClickListener(this);
findViewById(R.id.display_show_custom).setOnClickListener(this);
findViewById(R.id.display_show_title).setOnClickListener(this);
findViewById(R.id.display_use_loge).setOnClickListener(this);
findViewById(R.id.navigation).setOnClickListener(this);
findViewById(R.id.cycle_custon_view_gravity).setOnClickListener(this);
findViewById(R.id.toggle_visibility).setOnClickListener(this);
findViewById(R.id.toggle_system_ui).setOnClickListener(this);
mCustomView = getLayoutInflater().inflate(R.layout.custom_view, null);
ActionBar bar = getActionBar();
// 向actionbar中添加自定义视图
bar.setCustomView(mCustomView);
// 向actionbar中添加导航标签
bar.addTab(bar.newTab().setText("TAB 1").setTabListener(this));
bar.addTab(bar.newTab().setText("TAB 2").setTabListener(this));
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_item, menu);
return true;
}
@Override
public void onClick(View v) {
int flag = 0;
ActionBar bar = getActionBar();
switch (v.getId()) {
case R.id.display_home_as_up:
//显示向上的箭头
flag = ActionBar.DISPLAY_HOME_AS_UP;
break;
case R.id.display_show_home:
//显示icon
flag = ActionBar.DISPLAY_SHOW_HOME;
break;
case R.id.display_show_custom:
//显示自定义View
flag = ActionBar.DISPLAY_SHOW_CUSTOM;
break;
case R.id.display_show_title:
flag = ActionBar.DISPLAY_SHOW_TITLE;
break;
case R.id.display_use_loge:
flag = ActionBar.DISPLAY_USE_LOGO;
break;
case R.id.navigation:
bar.setNavigationMode(bar.getNavigationMode() == ActionBar.NAVIGATION_MODE_STANDARD ? ActionBar.NAVIGATION_MODE_TABS
: ActionBar.NAVIGATION_MODE_STANDARD);
break;
case R.id.cycle_custon_view_gravity:
ActionBar.LayoutParams lp = (LayoutParams) mCustomView
.getLayoutParams();
int newGravity = 0;
/**
* 1.如果两个数都是奇数进行按位与(&)运算结果就是较小的奇数
* 2.如果两个数都是奇数进行按位或(|)运算结果就是较大的奇数
* 3.对奇数进行按位取反(~)运算得到的是偶数
* 4.奇数与偶数进行&运算结果恒为0
* 我们可以观察这里的Gravity的几个常量都是奇数而且Gravity.RELATIVE_HORIZONTAL_GRAVITY_MASK
* 值最大
*/
switch (lp.gravity & Gravity.RELATIVE_HORIZONTAL_GRAVITY_MASK) {
case Gravity.START:
newGravity = Gravity.CENTER_HORIZONTAL;
break;
case Gravity.CENTER_HORIZONTAL:
newGravity = Gravity.END;
break;
case Gravity.END:
newGravity = Gravity.START;
break;
}
/*
* lp.gravity & ~Gravity.RELATIVE_HORIZONTAL_GRAVITY_MASK的结果恒为0
* 0| newGravity结果恒为newGravity。所以这里进行了复杂的运算其实就是相当于
* lp.gravity=newGravity;
*/
/*lp.gravity = lp.gravity & ~Gravity.RELATIVE_HORIZONTAL_GRAVITY_MASK
| newGravity;*/
lp.gravity=newGravity;
bar.setCustomView(mCustomView, lp);
break;
case R.id.toggle_visibility:
if (bar.isShowing()) {
bar.hide();
} else {
bar.show();
}
break;
case R.id.toggle_system_ui:
if ((getWindow().getDecorView().getSystemUiVisibility() & View.SYSTEM_UI_FLAG_FULLSCREEN) != 0) {
getWindow().getDecorView().setSystemUiVisibility(0);
}else{
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN);
}
break;
}
/*
* 1.当在配置文件中为activity设置了android:logo属性时, logo会代替icon出现在actionbar的左侧。
* 2.如果要单独显示logo必须DISPLAY_USE_LOGO与DISPLAY_SHOW_HOME同时设置为true。
* 3.默认情况下actionbar的显示布局为DISPLAY_SHOW_TITLE(值为8)、DISPLAY_SHOW_HOME(值为2)
* DISPLAY_USE_LOGO(值为1),相当于bar.setDisplayOptions(
* DISPLAY_SHOW_TITLE|DISPLAY_SHOW_HOME|DISPLAY_USE_LOGO)。
* 我们知道^(异或)的特点一是相当于半加运算(不带进位的加法运算)二是a^b=c,c^b=a(即经过两次
* 异或运算又回到原来的值)。
* 所以在默认情况下我们使用bar.getDisplayOptions()得到的值是11即由8^2^1得到,也就是我们
* 将TITLE、HOME、LOGO三个常量置为true的结果。
* 4.setDisplayOptions(change, flag);方法只有当change与flag中同时包含某一常量时
* 该常量才会在actionbar中显示。
* 5.默认状态下bar.getDisplayOptions()的值为11包含三个常量,如果flag为DISPLAY_HOME_AS_UP
* 则change的值为15,则此时chang当中就包含了四个常量
* DISPLAY_SHOW_TITLE|DISPLAY_SHOW_HOME|DISPLAY_USE_LOGO|DISPLAY_HOME_AS_UP
* 当执行bar.setDisplayOptions(change, flag);时因为change和flag中同时包含了DISPLAY_HOME_AS_UP
* 所以DISPLAY_HOME_AS_UP会显示,而其余依旧保持默认状态。
* 当再次点击按钮再次执行change = bar.getDisplayOptions() ^ flag;由于是第二次异或
* 相当于将DISPLAY_HOME_AS_UP从change中去除了,所以此时长change中就只有三个常量了
* DISPLAY_SHOW_TITLE|DISPLAY_SHOW_HOME|DISPLAY_USE_LOGO,再执行
* bar.setDisplayOptions(change, flag)由于只有flag中有DISPLAY_HOME_AS_UP
* 就会将DISPLAY_HOME_AS_UP隐藏了。其余按钮运算结果也是一样的。
*/
int change = bar.getDisplayOptions() ^ flag;
/*
* System.out.println("options:"+bar.getDisplayOptions());
* System.out.println("flag:"+flag);
* System.out.println("change:"+change);
*/
// System.out.println("~Gravity.RELATIVE_HORIZONTAL_GRAVITY_MASK:"+(Gravity.END
// & ~Gravity.RELATIVE_HORIZONTAL_GRAVITY_MASK ));
// System.out.println("~Gravity.RELATIVE_HORIZONTAL_GRAVITY_MASK:"+(Gravity.START
// & ~Gravity.RELATIVE_HORIZONTAL_GRAVITY_MASK ));
// System.out.println("~Gravity.RELATIVE_HORIZONTAL_GRAVITY_MASK:"+(Gravity.CENTER_HORIZONTAL
// & ~Gravity.RELATIVE_HORIZONTAL_GRAVITY_MASK ));
// System.out.println("DISPLAY_SHOW_TITLE:"+ActionBar.DISPLAY_SHOW_TITLE);
bar.setDisplayOptions(change, flag);
}
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
// TODO Auto-generated method stub
}
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
// TODO Auto-generated method stub
}
@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
// TODO Auto-generated method stub
}
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-15 08:28:18