这是我试图实现的目标:我有 ActioBar,并且在 ActionBar 上有一个名为 Login 的菜单项。单击此登录菜单项时,它会在操作栏中添加一个新选项卡,并在父活动的容器内加载带有 login_layout 的片段。如果我单击任何其他选项卡,登录选项卡就会消失。并且只有在再次单击登录菜单项。登录成功后,我想将菜单项的标题更改为注销。现在将登录菜单项的标题设置为注销后,如果我单击它,它不应该在操作栏上添加任何选项卡,因为用户已经是登录。
我有一个工作代码,直到用户成功登录的部分,因此他登录菜单项的标题已更改为注销。但我遇到的问题是,现在当用户单击注销时,它仍然添加选项卡并显示登录片段。
这样做的简单方法是 menuItem.getTitle() 并根据 menuItem 的当前标题限制操作。但我认为这不是实现此目的的好方法。所以现在我尝试使用标志“loginMenuItemFlag”并尝试解决问题但没有成功。我已经能够让它工作到它改变登录菜单项的标题以注销但当用户单击注销时它再次添加/显示登录选项卡我不想要。谁能告诉我我做错了什么,并指出我正确的方向。谢谢。
下面是我创建 menuItem 并添加选项卡、删除选项卡、更改标志、根据标志值更改菜单项的标题的类的代码:
public class HomeActivity extends SherlockFragmentActivity {
String mCurFilter;
static boolean flag,loginMenuItemFlag;
LoginScreenFragment loginFragment;
HomeFragment homeFragment;
CartFragment cartFragment;
MyFragment myFragment;
FragmentTransaction ft, ft2;
ActionBar actionbar;
MenuItem loginItem;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.home);
// ActionBar
actionbar = getSupportActionBar();
actionbar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
homeFragment = new HomeFragment();
cartFragment = new CartFragment();
myFragment = new MyFragment();
loginFragment = new LoginScreenFragment();
actionbar.addTab(actionbar.newTab()
.setText(R.string.home_fragment_title)
.setTabListener(new MyTabsListener(homeFragment))
.setTag("HOME"));
actionbar.addTab(actionbar.newTab()
.setText(R.string.cart_fragment_title)
.setTabListener(new MyTabsListener(cartFragment))
.setTag("CART"));
actionbar.addTab(actionbar.newTab()
.setText(R.string.my_fragment_title)
.setTabListener(new MyTabsListener(myFragment))
.setTag("MYFragment"));
if (!flag) {
ft = getSupportFragmentManager().beginTransaction();
ft.add(R.id.fragment_container, homeFragment);
ft.show(homeFragment);
ft.add(R.id.fragment_container, cartFragment);
ft.hide(cartFragment);
ft.add(R.id.fragment_container, myFragment);
ft.hide(myFragment);
ft.add(R.id.fragment_container, loginFragment);
ft.hide(loginFragment);
ft.commit();
flag = true;
} else {
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt("tab", getSupportActionBar()
.getSelectedNavigationIndex());
}
@Override
public boolean onCreateOptionsMenu(final Menu menu) {
loginItem = menu.add(R.string.menuitem_login);
loginItem.setTitle(R.string.menuitem_login);
loginItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
loginItem.setOnMenuItemClickListener(new OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
if(!loginMenuItemFlag){
Tab loginTab = actionbar.newTab()
.setText(R.string.login_fragment_title)
.setTabListener(new MyTabsListener(loginFragment))
.setTag(R.string.login_label);
actionbar.addTab(loginTab);
actionbar.selectTab(loginTab);
loginItem.setVisible(false);
loginItem.setTitle(R.string.login_label);
//loginMenuItemFlag = false;
}
else{
loginItem.setTitle(R.string.menuitem_login);
//loginMenuItemFlag = false;
}
return false;
}
});
return true;
}
// removes TAB at a specified position
public void deleteTabAt(int tabPosition) {
actionbar = getSupportActionBar();
actionbar.removeTabAt(tabPosition);
}
//setting Login menu Item to visible when Login tab has been removed from the tabs
public void setLoginMenuItemVisible() {
loginItem.setVisible(true);
}
public void changeLoginMenuFlag(){
loginMenuItemFlag = false;
}
//chaging Log In menu item to Log out upon successful Log in
public void changeLoginMenutItem(){
if(!loginMenuItemFlag){
loginItem.setTitle(R.string.menuitem_logout);
loginMenuItemFlag = false;
}else{
loginItem.setTitle(R.string.menuitem_login);
loginMenuItemFlag= true;
}
}
class MyTabsListener implements ActionBar.TabListener {
public SherlockFragment fragment;
public MyTabsListener(SherlockFragment fragment) {
this.fragment = fragment;
}
@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
System.out.println("TabReselected " + tab.getPosition());
}
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
System.out.println("TabSelected " + tab.getPosition());
ft.show(this.fragment);
}
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
System.out.println("TabUnselected " + tab.getPosition());
ft.hide(this.fragment);
//making check if the unselected tab was Login tab(located at tab position 3),if it was a login tab than we remove it from ActionBar
if (tab.getPosition() == 3) {
deleteTabAt(tab.getPosition());
setLoginMenuItemVisible();
}
}
}
}
下面是正在执行登录操作的 LoginFragment 中的代码。下面是在登录尝试后执行的代码片段。
@Override
public void sendResponse(String response) {
pd.dismiss();
System.out.println("Response in the callback: " + response);
if (response != null) {
FragmentActivity homeActivity = getActivity();
if (homeActivity instanceof HomeActivity) {
((HomeActivity) homeActivity).deleteTabAt(3);
((HomeActivity) homeActivity).changeLoginMenuFlag();
((HomeActivity) homeActivity).changeLoginMenutItem();
((HomeActivity) homeActivity).setLoginMenuItemVisible();
Toast.makeText(getActivity(), "Login Successful!",
Toast.LENGTH_LONG).show();
}
} else {
Toast.makeText(getActivity(), "Login failed,Please try again...",
Toast.LENGTH_LONG).show();
}
}
谢谢你。