在运行时删除工具栏项目
Remove Toolbar items on runtime
我的应用程序中有一个 工具栏,我想在应用程序执行期间动态修改它的内容(换句话说, 在 运行 时间).
例如,该应用可以拍摄和预览照片;预览这些照片后,用户可以 select 一些照片并执行向服务器发送操作。我还想让用户能够在其中一些照片被 selected 后删除照片,为此我希望操作栏上的 "delete" 项目(可通过垃圾桶图标识别)将仅当 selected 一张或多张照片时可见。
这可以吗?
如果是,如何?
换句话说,更一般地说,我想控制工具栏中的项目(可见性),将代码设置为 "visible" 仅当某些条件为 "true"(在上面的示例,当照片被 selected 时,或者在另一个示例中,当用户登录时)并且当它们 "false" 时不可见(当用户未登录时)。
现在我只需要 "remove"(或隐藏)工具栏中的项目,但了解 是否可以在工具栏中添加项目也很有用 运行-次.
我正在添加一些有助于理解问题的代码。
“/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" />
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
}
}
感谢您的宝贵时间。
隐藏图标:
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
请在您的 activity 中尝试此代码:
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_action_button).setVisible(true);
}
public void hideMenuItem(){
toolbar.getMenu().findItem(R.id.toolbar_action_button).setVisible(false);
}
希望对您有所帮助:)
我的应用程序中有一个 工具栏,我想在应用程序执行期间动态修改它的内容(换句话说, 在 运行 时间).
例如,该应用可以拍摄和预览照片;预览这些照片后,用户可以 select 一些照片并执行向服务器发送操作。我还想让用户能够在其中一些照片被 selected 后删除照片,为此我希望操作栏上的 "delete" 项目(可通过垃圾桶图标识别)将仅当 selected 一张或多张照片时可见。
这可以吗? 如果是,如何?
换句话说,更一般地说,我想控制工具栏中的项目(可见性),将代码设置为 "visible" 仅当某些条件为 "true"(在上面的示例,当照片被 selected 时,或者在另一个示例中,当用户登录时)并且当它们 "false" 时不可见(当用户未登录时)。
现在我只需要 "remove"(或隐藏)工具栏中的项目,但了解 是否可以在工具栏中添加项目也很有用 运行-次.
我正在添加一些有助于理解问题的代码。
“/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" />
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
}
}
感谢您的宝贵时间。
隐藏图标:
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
请在您的 activity 中尝试此代码:
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_action_button).setVisible(true);
}
public void hideMenuItem(){
toolbar.getMenu().findItem(R.id.toolbar_action_button).setVisible(false);
}
希望对您有所帮助:)