在运行时删除工具栏项

Ale*_*one 0 android runtime dynamic toolbar menuitem

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

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

这可能吗?如果是,怎么办?

工具列

换句话说,更笼统地说,我想控制工具栏中的项目(可见性),将代码设置为仅当某些条件为“真”时(在上述示例中,当选择照片时,在另一个示例中,当用户登录时)和“ false”(用户未登录时)不可见。

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

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

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

<?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" />
Run Code Online (Sandbox Code Playgroud)

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"/>
Run Code Online (Sandbox Code Playgroud)

工具栏所在的活动的一部分

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
    }
}
Run Code Online (Sandbox Code Playgroud)

谢谢你的时间。

Cro*_*ono 6

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

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
    }
Run Code Online (Sandbox Code Playgroud)

[编辑]

多亏了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);
    }
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你 :)

  • 我尝试了您的代码,它的效果很好:)同时,我发现方法“ getMenu()”也可以完成此操作,并且在您的示例中可以是“ public void showMenuItem(){toolbar.getMenu()。findItem( R.id.toolbar_action_button).setVisible(true)};“ 和“ public void hideMenuItem(){toolbar.getMenu()。findItem(R.id.toolbar_action_button).setVisible(false)};”和 ,并在我的代码中定义了“工具栏”。我认为此解决方案更好,因为它避免了创建新字段。如果您同意我的意见,能否请您将此信息添加为答案中的替代方法?谢谢 :) (2认同)