【问题标题】:Remove Toolbar items on runtime在运行时删除工具栏项
【发布时间】:2017-10-18 14:06:14
【问题描述】:

我的应用中有一个工具栏,我想在应用执行期间(换句话说,在运行时)动态修改其内容

例如,该应用能够拍摄和预览照片;一旦预览了这些照片,用户就可以选择一些照片并向服务器执行发送操作。我还想让用户在选择其中一些照片后能够删除照片,为此我希望操作栏上的“删除”项目(可通过垃圾桶图标识别)仅在一个或多个照片时可见照片被选中。

这可能吗? 如果是,如何?

换句话说,更一般地说,我想控制工具栏中的项目(可见性),将代码设置为仅当某些条件为“真”时它们才会“可见”(在上面的示例中,当照片是已选中,或者在另一个示例中,当用户登录时)并且当它们为“假”(当用户未登录时)时不可见。

现在我只需要在工具栏中“删除”(或使不可见)项目,但了解是否可以在运行时在工具栏中添加项目也很有用.

我正在添加一些有助于理解问题的代码。

app_bar.xml 文件在“/res/layout”中,以图形方式定义工具栏

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

<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/my_toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:elevation="4dp"
    android:theme="@style/ToolbarTheme" />

menu_resources.xml 文件,用于定义工具栏项

<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">

<!-- "User favourite function", should appear as action button if possible -->
<item
    android:id="@+id/action_app_icon"
    android:icon="@mipmap/ic_launcher"
    android:title="@string/action_bar_app_icon"
    app:showAsAction="always" />

<!-- Settings, should always be in the overflow -->
<item
    android:id="@+id/action_delete"
    android:icon="@drawable/trash"
    android:title="@string/action_bar_delete"
    app:showAsAction="always"/>

<!-- Settings, should always be in the overflow -->
<item
    android:id="@+id/action_settings"
    android:icon="@drawable/settings"
    android:title="@string/action_bar_settings"
    app:showAsAction="never"/>

<!-- About, should always be in the overflow -->
<item
    android:id="@+id/about"
    android:icon="@android:drawable/ic_dialog_info"
    app:showAsAction="never"
    android:title="@string/action_bar_about"/>

工具栏所在的 Activity 的一部分

public class myClass extends AppCompatActivity implements View.OnClickListener {

// Instantiating a toolbar
private Toolbar toolbar;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_my_class);

    // Adding toolbar to the activity
    toolbar = (Toolbar) findViewById(R.id.my_toolbar);
    setSupportActionBar(toolbar);

    // Get a support ActionBar corresponding to this toolbar
    ActionBar ab = getSupportActionBar();
    // Enable the Up button
    ab.setDisplayHomeAsUpEnabled(true);
    }

    // The method that creates an options menu
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_resource, menu);
        // This make the delete item invisible
        menu.findItem(R.id.action_delete).setVisible(false);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.action_settings:
                // Perform the settings action
                return true;
            case R.id.about:
                // Perform the about
                return true;
            case R.id.action_delete:
                deletePhotos();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }


    public static void manageSelection(Boolean state, int position){
        if (photoArray.getNumberSelected() == 0) {
            // disable the trash icon and its functionality;
        } else {
            // enable the trash icon with its functionality;
        }
    }

    // This method allows to deleteItems images to the array
    public void deletePhotos() {
        //code for deleting photos
    }
}

感谢您的宝贵时间。

【问题讨论】:

    标签: android dynamic runtime toolbar menuitem


    【解决方案1】:

    请在您的活动中尝试此代码:

    public class ActivityClass extends AppCompatActivity {
    
        MenuItem menuItem; // Make global toolbar's menuItem
    
        .
        .
        .
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.menu_layout, menu);
    
            menuItem = menu.findItem(R.id.toolbar_action_button) // Your toolbar´s button ID and save it in your global menuItem
    
            return super.onCreateOptionsMenu(menu);
        }
    
        public void showMenuItem(){
            menuItem.setVisible(true); // Call this method in runtime when you need show it
        }
    
        public void hideMenuItem(){
            menuItem.setVisible(false); // Call this method in runtime when you need hide it
        }
    

    [编辑]

    感谢Alessandro Iudicone 的评论,我们有另一种方法来获取工具栏的菜单,而无需全局 MenuItem,但只有全局 Toolbar 实例:

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.menu_layout, menu);
            return super.onCreateOptionsMenu(menu);
        }
    
        public void showMenuItem(){
            toolbar.getMenu().findItem(R.id.toolbar_actio‌​n_button).setVisible‌​(true);
        }
    
        public void hideMenuItem(){
            toolbar.getMenu().findItem(R.id.toolbar_actio‌​n_button).setVisible‌​(false);
        }
    

    希望对你有帮助:)

    【讨论】:

    • 我试过你的代码,它工作正常:) 同时,我发现方法“getMenu()”也可以完成这个,在你的例子中可能是“public void showMenuItem(){ toolbar.getMenu().findItem(R.id.toolbar_action_button).setVisible(true)};"和“公共无效 hideMenuItem(){toolbar.getMenu().findItem(R.id.toolbar_action_button).setVisible(false)};” ,在我的代码中定义了“工具栏”。我认为这个解决方案更好,因为它避免了创建新领域。如果您同意我的观点,您能否将此信息作为替代方式添加到您的答案中?谢谢你:)
    【解决方案2】:

    隐藏图标:

    toolbar.findViewById(R.id.menu_item_id).setVisibility(View.INVISIBLE);
    

    用于向工具栏添加视图:

    TextView textView = new TextView(MainActivity.this);
    textView.setText("Hello World");
    toolbar.addView(textView);
    

    这仅适用于工具栏本身的视图,不适用于溢出菜单。如果您想弄乱溢出菜单,您可能必须使用此堆栈溢出答案中的代码:Android Toolbar overflow menu view id

    【讨论】:

    • 我尝试使用您的代码,添加视图的部分似乎没问题...但隐藏图标似乎不起作用,因为方法“setVisible”在 Android Studio 中显示为红色并且错误“不能解决方法 'setVisible(int)'" 发生。我不确定您是否可以在工具栏的项目上执行“setVisible”方法(我认为这不是视图)。
    • 对不起,错字。它应该是 setVisibility。我更新了我的答案。
    • 我尝试了隐藏图标的代码,但似乎崩溃了。我还调试并发现它在该行崩溃并出现错误“java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法'void android.view.View.setVisibility(int)'”。无论如何,添加视图的部分可以工作并且很有用。谢谢。
    • 如果代码不在溢出菜单中,它可以正常工作。您是否使用了溢出菜单中的菜单 ID?
    • 如果你想让 View.GONE 消失而不是不可见,你可以使用 View.GONE 而不是 View.INVISIBLE。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多