【问题标题】:Changing Action Bar Menu Item Icon When Pressed in Android Studio在 Android Studio 中按下时更改操作栏菜单项图标
【发布时间】:2017-07-08 06:20:12
【问题描述】:

我正在开发这个简单的 Android 应用程序。我在操作栏上有三个菜单项,每个菜单项在单击它们时都会膨胀 3 个不同的片段。

我的问题:当我单击一个菜单项时,我希望该菜单项的图标更改为 drawables 文件夹中的另一个图标,并保持这种状态,直到我单击另一个菜单项,然后它将更改为第一个图标在我点击它之前。

我尝试使用带有“state_pressed”的选择器 .xml,当我单击菜单项时,它会更改图标一秒钟,但一旦我停止单击,它就会返回到第一个图标。您可以在下面找到相关代码。如果您能帮我解决这个问题,我将不胜感激。

submenu.xml (操作栏菜单):

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools" >
    <item
        android:id="@+id/action_todo"
        android:title=""
        android:icon="@drawable/action_bar_selector"
        app:showAsAction="always" />
</menu>

action_bar_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:drawable="@drawable/ic_check_box_white_24dp"
        android:state_pressed="true" />
    <item
        android:drawable="@drawable/ic_check_box_white_24dp_unpressed" />
</selector>

ProjectTodo.java (Fragment 类中的 Inflating Action Bar):

public void onCreateOptionsMenu(Menu menu, MenuInflater inflater){
    inflater.inflate(R.menu.submenu, menu);
}

public boolean onOptionsItemSelected(MenuItem item){
    int id = item.getItemId();
    if(id == R.id.action_back){
        ProjectDetails frag = new ProjectDetails();
        ProjectMainListFragmentChanger fragInterface = (ProjectMainListFragmentChanger) getActivity();
        fragInterface.projectMainListChangeFragment(frag);
        return false;
    }

    if(id == R.id.action_details){
        return true;
    }

    if(id == R.id.action_todo){
        ProjectDetails frag = new ProjectDetails();
        ProjectTodoFragmentChanger fragInterface = (ProjectTodoFragmentChanger) getActivity();
        fragInterface.projectTodoChangeFragment(frag);      
        return false;
    }
    return super.onOptionsItemSelected(item);
}

您可以看到当前应用程序的快速 .gif 图像。当我点击菜单项时,它只变为第二个图标一秒钟,然后又回到原来的图标:

【问题讨论】:

  • 操作栏为每个活动创建一次。每当您需要更改操作栏中的某些内容时,您都需要使操作栏无效。因此,每当您单击图标时,都会重新填充菜单项并使操作栏无效

标签: java android xml android-studio mobile


【解决方案1】:

如果您只想切换项目,您可以使用 onOptionsItemSelectedonPrepareOptionsMenu 进行切换

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    boolean result = true;
    switch (item.getItemId()) {
        case R.id.menu_details_save_toggle:
            if (mIsSaved) { //you could modify this to check the icon/text of the menu item
                mIsSaved = false;
            } else {
                mIsSaved = true;
            }
            invalidateOptionsMenu(); //cause a redraw
            break;
        default:
            result = super.onOptionsItemSelected(item);

    }
    return result;
}

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    if (mIsSaved) {
        //in production you'd probably be better off keeping a reference to the item 
        menu.findItem(R.id.menu_details_save_toggle)
            .setIcon(R.drawable.action_saved_on)
            .setTitle(R.string.action_unsave);
    } else {
        menu.findItem(R.id.menu_details_save_toggle)
            .setIcon(R.drawable.action_saved_off)
            .setTitle(R.string.action_save);
    }
    return super.onPrepareOptionsMenu(menu);
}

【讨论】:

  • 感谢尼克的回复。因此,如果不使用 onPrepareOptionsMenu() 方法,我无法简单地使用选择器 xml 来实现我想要的,是吗?
  • 我认为不可能。但是您可以使用可检查的界面See this answer
【解决方案2】:

就这么简单!!

ToobarActivity.class:

    public class ToolbarActivity extends AppCompatActivity {

    private Menu menu;// Global Menu Declaration

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_toolbar);

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);

        setSupportActionBar(toolbar);


        //This is my Back Button View onClick on toolbar
        toolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        this.menu = menu;
        getMenuInflater().inflate(R.menu.main_menu, menu);


        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //This is the Answer to your problem
        if (id == R.id.actionsignout) {
            menu.getItem(1).setVisible(true);
            menu.getItem(0).setVisible(false);
            return true;
        }else if (id == R.id.action) {
            menu.getItem(0).setVisible(true);
            menu.getItem(1).setVisible(false);
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {



        return super.onPrepareOptionsMenu(menu);
    }
}

关于 res/menu/main_menu.xml:

将第二项可见性设置为false

<?xml version="1.0" encoding="utf-8"?>

<item android:id="@+id/actionsignout"
    app:showAsAction="always"
    android:icon="@drawable/ic_pause_black_24dp"
    android:title="Sign Out"/>

<item android:id="@+id/action"
    app:showAsAction="ifRoom"
    android:visible="false" 
    android:icon="@drawable/ic_play_arrow_black_24dp"
    android:title=""/>

【讨论】:

  • 虽然此代码可以回答问题,但提供有关其解决问题的方式和原因的信息可提高其长期价值
猜你喜欢
  • 2014-12-05
  • 2012-04-13
  • 1970-01-01
  • 2014-01-20
  • 1970-01-01
  • 2012-06-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多