在android中保持ActionBar图标的按下状态

时间:2014-05-13 21:48:04

标签: android android-fragments

行动状态栏


按下状态 ::

enter image description here

默认状态 ::

enter image description here


我在做什么 ::

  • 我正在使用拆分的操作栏
  • 点击底部的图标,我正在更改片段
  • 功能正常运作

我想要什么 ::

  • 是否可以保持动作栏项目的按下状态直到 我点击下一个操作栏图标
  • 然后,当我说点击图中的星星时,我想保留星星 按状态为蓝色,搜索图标返回正常状态

我使用的代码 ::

@Override
    public boolean onOptionsItemSelected(MenuItem item) {

         if(item.getItemId()==R.id.searchID){
            //SEARCH Button Handling
            //((View) item).setBackgroundResource(R.color.actionBarIconPressed);
            //item.setIcon(R.color.actionBarIconPressed);
            item.setEnabled(true);
            ft1=getSupportFragmentManager().beginTransaction();
            ft1.hide(fragment1);
            //Condition to check whether the fragment is already in container & based on that do appropriate actions
            if (getSupportFragmentManager().findFragmentByTag("SearchFragmentTag")==null){             
                ft1.add(R.id.content_frame, fragSearch, "SearchFragmentTag");
                ft1.addToBackStack(null);
                ft1.commit();
            }else{
                ft1.remove(fragSearch);
                ft1.add(R.id.content_frame, fragSearch, "SearchFragmentTag");
                ft1.commit();
            }
            return true;
        }
        return super.onOptionsItemSelected(item);
    }    



    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater menuInflater = getSupportMenuInflater();
        menuInflater.inflate(R.menu.actionbar_sort_menu, menu);

        return super.onCreateOptionsMenu(menu);
    }

我的问题 ::

  1. 如何修改我的代码以实现此功能?
  2. 有可能吗?
  3. 有什么可能的方法?

3 个答案:

答案 0 :(得分:2)

onOptionsItemSelected中,您可以将MenuItem转换为View,然后更改其背景。我得到了一个开始答案,但我认为你可以改进它并根据你的需要改变它:

在数组中初始化您的ID:

int[] listItemId = { R.id.searchID, R.id.ratindID, R.id.likeID, R.id.shareID };

调用您选择的项目选择方法:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch(item.getItemId()) {
         case R.id.searchID:
             // call private method with int 1
             onItemChangeBackground(1);
             ... // do some stuff
             return true;
         case R.id.ratindID:
             onItemChangeBackground(2);
             ... // do some stuff
             return true;
         case R.id.likeID:
             onItemChangeBackground(3);
             ...
             return true;
         case R.id.shareID:
             onItemChangeBackground(4);
             ...
             return true;
    }
    return super.onOptionsItemSelected(item);
}

通过切换int值来更改背景项:

private void onItemChangeBackground(int i) {
    // Loop to reinit the background items
    for(int ii = 0; ii < listItemId.length; ii++) { 
        // Cast the MenuItem into a View
        ( (View) findViewById(listItemId[ii]) )
                 // And set the default background (for example dark)
                 .setBackgroundColor(getResources().getColor(R.color.dark));
    }
    // Selected background
    switch(i) {
        case 1: ( (View) findViewById(R.id.searchID) )
                 .setBackgroundColor(getResources().getColor(R.color.blue));
            break;
        case 2: ( (View) findViewById(R.id.ratindID) )
                 .setBackgroundColor(getResources().getColor(R.color.blue));
            break;
        case 3: ( (View) findViewById(R.id.likeID) )
                 .setBackgroundColor(getResources().getColor(R.color.blue));
            break;
        case 4: ( (View) findViewById(R.id.shareID) )
                 .setBackgroundColor(getResources().getColor(R.color.blue));
            break;
    }
}  

当您想要重新初始化背景项时,也可以使用setBackgroundDrawable()设置带有选择器的drawable(就像在styles.xml中一样)。经过测试,它有效!

另一种解决方案可能是使用invalidateOptionsMenu()。这将通过再次调用onCreateOptionsMenu()来清除和重绘菜单。请记住,不要调用invalidateOptionsMenu(),最后一种方法永远不会被召回,只能在活动创建的第一个方法中调用。这就是我们需要使其内容无效的原因:

更新所选项目的整数:

@Override
public boolean onOptionsItemSelected(MenuItem item) {  
    if(item.getItemId()==R.id.searchID){
        nbItemSelected = 1;
        invalidateOptionsMenu();
        ...
    } else if(...) {
        nbItemSelected = 2;
        invalidateOptionsMenu();
    } ...
} 

然后,在创建选项时更改背景:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_layout, menu);
    if(nItemSelected != 0) {
         // Find item, cast the selected item to a view
         ( (View) menu.findItem(listItemId[nItemSelected]) )
              // Change its background
              .setBackgroundColor(getResources().getColor(R.color.blue));
    } 
    ...
    return true;
}

我想这也有可能,它可能有用。

答案 1 :(得分:0)

您是否正在创建TabBarView,例如您可以在iOs中找到的那些?

如果是这样,拆分操作栏不是最好的组件,最好将ViewPagerIndicator与ViewPager组件一起使用。在那里,您可以使用自定义图标状态和背景创建自定义图标。

我有一段很久以前创建的代码片段,用于需要该组件的应用程序。也许你可以环顾四周并拿走你需要的东西(但我告诉你,代码不是你能找到的最好的代码,因为我匆忙,事情可以做得更好,更好):

https://gist.github.com/aldoborrero/70fbeb062fab0ccc7d87

答案 2 :(得分:0)

@Casper你是否尝试过为ActionBar设置自定义选择器?
请参阅下面的一个

drawable/tab_bg_selector.xml
    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <!-- Active tab -->
        <item android:drawable="@drawable/tab_selected_customtabs" android:state_focused="false" android:state_pressed="false" android:state_selected="true"/>
        <!-- Inactive tab -->
        <item android:drawable="@drawable/ab_transparent_customtabs" android:state_focused="false" android:state_pressed="false" android:state_selected="false"/>
        <!-- Pressed tab -->
        <item android:drawable="@drawable/tab_selected_pressed_customtabs" android:state_pressed="true"/>
        <!-- Selected tab -->
        <item android:drawable="@drawable/tab_selected_focused_customtabs" android:state_focused="true" android:state_pressed="false" android:state_selected="true"/>
    </selector>