当前位置: 首页 > 知识库问答 >
问题:

不能正确地实现布尔逻辑

苏淇
2023-03-14

这是我试图实现的:我有ActioBar,我有一个名为登录在ActionBar上的菜单项。当点击这个登录菜单项时,它会在动作栏中添加一个新选项卡,并在父活动的容器中加载带有login_layout的片段。如果我点击任何其他选项卡,登录选项卡就会消失。只有再次点击登录菜单项,它才能重新出现。一旦登录成功,我想将菜单项的标题更改为注销。现在,在将登录菜单项的标题设置为注销后,如果我点击它,它不应该在动作栏上添加任何选项卡,因为用户已经登录。

我有一个工作代码,用户已成功登录,因此登录菜单项的标题已更改为注销。但我遇到的问题是,现在当用户单击“注销”时,它仍然会添加选项卡并显示登录片段。

做这件事最简单的方法就是去menuItem。getTitle()并基于菜单项的当前标题限制操作。但我不认为这是一个好办法来实现这一点。所以现在我尝试使用标志“LoginNuItemFlag”,并试图解决这个问题,但没有成功。我已经能够让它工作到一个点,它改变了登录菜单项的标题,以注销,但当用户点击注销它添加/再次显示登录标签,我不想。谁能告诉我我做错了什么,并给我指出正确的方向吗。非常感谢。

下面是im创建menuItem并添加选项卡、删除选项卡、更改标志、基于标志值更改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();
        }
    }
}

}

下面是登录片段中执行登录操作的代码。以下是登录尝试后执行的代码片段。

@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();
    }

}

谢谢你。

共有1个答案

锺离霖
2023-03-14

使用onPrepareOptions菜单()更改菜单,使用onOptions ItemSelected处理菜单项点击:

private boolean mLoggedIn;
private MenuItem mItemLogIn;
private MenuItem mItemLogOut;

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    mItemLogIn = menu.add("Log In");
    mItemLogOut = menu.add("Log Out");

    //---set more properties--

    return super.onCreateOptionsMenu(menu);
}

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    mItemLogIn.setVisible(!mLoggedIn);
    mItemLogOut.setVisible(mLoggedIn);
    return super.onPrepareOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if(item.equals(mItemLogIn)){
        //--login--
        mLoggedIn = true;
        invalidateOptionsMenu();
    }else if(item.equals(mItemLogOut)){
        //--log out--
        mLoggedIn = false;
        invalidateOptionsMenu();
    }
    return super.onOptionsItemSelected(item);
}
 类似资料:
  • 我有一个问题,比较布尔值的if语句不起作用。最后一个if语句,其中notifFlag==true,如果我将它放在那里,它就不起作用了。日志显示notifFlag设置为true,但if语句未运行。但是,如果删除notifFlag==true,则if语句将运行。 带有标志得日志: 没有标志得日志:

  • 问题内容: 我想使用 AND OR 获取所有文档。 我写错了这个逻辑吗? 为什么我的查询返回0个结果? 注意 :我可以接受查询或过滤器来解决此问题。 这些是一些示例文档: 询问 问题答案: 您无法获得结果的主要原因是因为您试图对进行过滤,这是一个已分析的字段。如果要对该字段进行匹配,则需要更新类型映射以将该字段设置为。请参见以下示例映射: 从此处开始阅读有关映射的信息:http : //www.e

  • 问题内容: 我有一个似乎无法满足的简单要求:我有一个产品页面。产品具有供应商,供应商输入是带有自动完成功能的文本字段。如果用户输入数据库中不存在的供应商,则需要添加它。要添加它,我在.load()页面上有一个DIV并调用了我的/ Vendor / Create控制器方法。该方法的视图使用: 这应该通过ajax发布我的表单,完成后调用Javascript。我遇到的问题是,提交后,我的整个页面都会刷新

  • 问题内容: 我正在做一个简单的游戏,您在屏幕上移动一个球,并尝试避免屏幕上出现其他障碍。 我遇到的问题是,当我尝试评估您是否接触另一个块时,无论我的布尔值等于什么,我的if语句总是返回第一个结果。这是我评估陈述的方法 这是发送 sect 布尔值的代码部分: 这是完整的代码: 请告诉我我在做什么错!!! 谢谢! 问题答案: 你需要 代替 甚至 更好的 办法是使用

  • 问题内容: 我在一本书中找到了这段代码,并在Netbeans中执行了它: 我只是不明白为什么这段代码的输出是真实的,任何人都可以启发我,谢谢。 问题答案: 它缺少双等号。因此,它是在做赋值而不是相等比较(请记住,赋值的返回值是新值)。在大多数情况下,大多数类型都不是布尔值,这意味着结果不是布尔值,因此对一条语句而言它是非法的,从而导致编译器错误。但是,由于此处的类型已经是布尔值,因此赋值会导致布尔

  • 我正在尝试使用argparse模块使我的Python程序接受灵活的命令行参数。我想传递一个简单的布尔标志,并说或来执行代码中的相应分支。 请考虑以下内容。 这是为什么?!!intflag似乎解析正确,但布尔标志总是解析为,即使我在命令行参数中明确提到我希望它是。 我哪里错了?