[英]When I open new layouts, the menu item duplicates
我正在学习如何创建一个应用程序,并且已经想出了如何构建一个登录活动和一个用于注销的菜单,让您返回到登录布局。 但是,如果我浏览不同的布局/活动,则用于注销重复项的菜单项。 我相信这是由于在每个布局上都创建了菜单,但我不确定如何更改它以使其不重复。
这是我的片段。
public class UserFragment extends Fragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle
savedInstanceState) {
return inflater.inflate(R.layout.activity_user_fragment, container, false);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.fragment_logout, menu);
}
}
我的 LoginActivity.class
public class LoginActivity extends AppCompatActivity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
Button b1login = (Button) findViewById(R.id.btlogin);
Button b2login_cancel = (Button) findViewById(R.id.btcancel_login);
assert b1login != null;
b1login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EditText ed1 = (EditText) findViewById(R.id.etuser_name);
EditText ed2 = (EditText) findViewById(R.id.etpassword);
if (ed1.getText().toString().equals(getText(R.string.user_id)) &&
ed2.getText().toString().equals(getText(R.string.user_password))) {
Toast.makeText(getApplicationContext(), R.string.successful_login,
Toast.LENGTH_SHORT).show();
setContentView(R.layout.activity_clients);
} else {
Toast.makeText(getApplicationContext(), R.string.unsuccessful_login,
Toast.LENGTH_SHORT).show();
}
}
});
assert b2login_cancel != null;
b2login_cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
System.exit(0);
}
});
}
//Menu option logout return to login screen.
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.menu_item_logout) {
Intent i = new Intent(this, LoginActivity.class);
this.startActivity(i);
return true;
}
return super.onOptionsItemSelected(item);
}
public void addClient(View view) {
setContentView(R.layout.activity_new_client);
}
public void submitClient(View view) {
setContentView(R.layout.activity_sessions);
}
public void cancelClient(View view) {
setContentView(R.layout.activity_clients);
}
public void newSession(View view) {
setContentView(R.layout.activity_new_session);
}
public void cancelSessionCompletion(View view) {
setContentView(R.layout.activity_sessions);
}
public void cancelSession(View view) {
setContentView(R.layout.activity_sessions);
}
}
片段布局。
<menu
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/menu_item_logout"
android:icon="@drawable/ic_logout"
android:title="@string/logout"
app:showAsAction="ifRoom|withText" />
</menu
编辑:
我删除了最初创建菜单的片段以及 UserFragment 中的菜单代码,并将菜单本身硬编码到 LoginActivity 类中,从而解决了重复问题。
代码添加菜单。
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate(R.menu.menu, menu);
return true;
}
但是,菜单现在显示在登录屏幕上。 我如何防止它显示在那里?
以下是您需要做的:
在您的代码中,我看到您的片段使用了以下方法:
setHasOptionsMenu(true);
您可以在这里做的是使用 if 语句来查看用户之前是否登录过,如果没有,则将其设置为 true 否则,什么都不做(就像设置为 false 一样)。
如果您想让用户从这些活动中退出或将其退出,您可以在其他活动中重复使用该菜单!
我希望这会有所帮助!
编辑
根据您上面的示例代码,您的第一部分显示了您将在 Fragment 类中执行的操作 - setHasOptionsMenu(true)。 现在,您似乎有两个注销菜单,在活动和片段中 - 我没有看到您在 LoginActivity 中使用片段的位置 - 除非它在不同的活动中的其他地方!
为了在不同的活动中拥有不同的菜单项,您需要创建不同的菜单 xml 布局。
所以 res 文件夹中已经有一个名为 menu.xml 的文件。 您需要在同一文件夹中创建新的 xml 文件。
然后在该活动的 Java 代码中:- 在覆盖 Oncreateoptionmenu 中扩充您想要的菜单。
与我在此处的回答https://stackoverflow.com/a/63008005/5916188类似,解决方法是每次在添加菜单之前删除菜单(如果存在)。
请注意,现有菜单逐项删除(R.id ...),而膨胀的菜单则像往常一样通过菜单(R.menu ...)添加。
这样,您可以将菜单保留在片段中。 像这样:
@Override public void onCreateOptionsMenu (@NonNull Menu menu, @NonNull MenuInflater
inflater)
{
super.onCreateOptionsMenu (menu, inflater);
removeMenuItemIfPresent (menu, R.id.menu_search_options);
removeMenuItemIfPresent (menu, R.id.menu_sample_filter1);
removeMenuItemIfPresent (menu, R.id.menu_sample_filter2);
inflater.inflate (R.menu.menu_search_menu, menu);
}
private void removeMenuItemIfPresent (@NonNull Menu menu, int resourceIDToRemove)
{
MenuItem menuItemToRemove = menu.findItem (resourceIDToRemove);
if (menuItemToRemove != null) {
menu.removeItem (menuItemToRemove.getItemId ());
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.