Actionbar 切换布局

来源:互联网 发布:耳机声音放大器软件 编辑:程序博客网 时间:2024/05/29 13:08

一.ActionBar动态切换布局

A.非兼容下的ActionBar


public class MainActivity extends Activity

android.app.ActionBar actionBar=this. getActionBar();

若actionBar报空指针异常 请见     http://blog.csdn.net/yueqinglkong/article/details/39577749

value 下的Styles

<resources>    <!-- Base application theme. -->    <!--<style name="AppTheme" parent="Theme.AppCompat.Light">-->    <style name="AppTheme" parent="@android:style/Theme.Holo.Light">        <!-- Customize your theme here. -->    </style>


B.android.support.v7.app.ActionBar;

public class MainActivity extends AppCompatActivity

android.support.v7.app.ActionBar actionBar = getSupportActionBar();


<style name="AppTheme" parent="Theme.AppCompat.Light">

下面实现布局切换:

btn_ActionBarA.setOnClickListener(new View.OnClickListener() {    @Override    public void onClick(View v) {        isEditingMode=false;        invalidateOptionsMenu();    }});btn_ActionBarB.setOnClickListener(new View.OnClickListener() {    @Override    public void onClick(View v) {        isEditingMode=true;        Log.i("MainActivity", "ActionBarB clicked");        invalidateOptionsMenu();    }});


@Overridepublic boolean onPrepareOptionsMenu(Menu menu) {    Log.i("MainAcitvity", "onPrepareOptionsPanel");    MenuInflater inflater = getMenuInflater();    menu.clear();    if (this.isEditingMode) {        inflater.inflate(R.menu.actionbar2, menu);    } else {        inflater.inflate(R.menu.actionbar, menu);    }    return super.onPrepareOptionsMenu(menu);}

@Overridepublic boolean onCreateOptionsMenu(Menu menu) {    Log.i("MainAcitvity", "onCreateOptionsMenu");    MenuInflater inflater = getMenuInflater();    inflater.inflate(R.menu.actionbar, menu);    MenuItem searchItem = menu.findItem(R.id.action_search);    MenuItemCompat.setOnActionExpandListener(searchItem, new MenuItemCompat.OnActionExpandListener() {        @Override        public boolean onMenuItemActionExpand(MenuItem item) {            Toast.makeText(MainActivity.this, "Expand", Toast.LENGTH_LONG);            return true;        }        @Override        public boolean onMenuItemActionCollapse(MenuItem item) {            Toast.makeText(MainActivity.this, "Collapse", Toast.LENGTH_LONG);            return true;        }    });    return super.onCreateOptionsMenu(menu);}

onCreateOptionsMenuonPrepareOptionsMenu的差別在哪呢?

在做菜单的功能,发现,菜单越来越多,后来仔细看了他们的区别,如下:


但是onCreateOptionsMenuonPrepareOptionsMenu的差別在哪呢?

android中可以重写activity的两个方法进行创建菜单:onPrepareOptionsMenu(Menu menu),onCreateOptionsMenu。

两种方法的区别是,前者是每次点击menu键都会重新调用,所以,如果菜单需要更新的话,就用此方法。而后者只是在activity创建的时候执行一次。

值得注意的是,在使用前者的时候,如果你每次都调用了menu.add()方法的话,那么菜单中的项目就会越来越多,所以,一般情况下是要调用一下menu.clear()的。
onCreateOptionsMenu
  只會呼叫一次,他只會在MENU顯示之前,去做一次!!!之後就不會再去呼叫!
onPrepareOptionsMenu
  onPrepareOptionsMenu是每次在display menu之前,都會去呼叫,
  只要按一次menu按鍵,就會呼叫一次。
  所以你會發現每次只要按一次menu按鍵,
  menu選單就會多兩個(因為我們預設是兩個)
  你可以利用onPrepareOptionsMenu來做update menu狀態的動作

如果你要把menu現有的option清空,就是下面那行CODE

menu.clear();

还有,在fragment中的onCreateOptionsMenu和Activity中的参数不同的,多了个MenuInflater,所以在fragment中调用MenuInflater的时候,要这么调用:

MenuInflater inflater = this.getActivity().getMenuInflater();

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
// 在onCreateOptionsMenu()之前必须在onCreate中调用setHasOptionsMenu(true)
inflater.inflate(R.menu.menu_three, menu);   
super.onCreateOptionsMenu(menu, inflater);
}

C:大早上搜索资料发现更为逆天的方式

http://blog.csdn.net/xyz_lmn/article/details/12754785



先更到这 睡觉

0 0
原创粉丝点击