0

これが私が達成しようとしていることです:私はActioBarを持っていて、ActionBar上にLoginという名前のメニュー項目を持っています。このログインメニュー項目をクリックすると、アクションバーに新しいタブが追加され、親アクティビティのコンテナ内にlogin_layoutを含むフラグメントが読み込まれます。クリックすると、ログインタブ以外のタブが消えます。また、再表示できるのは、ログインメニュー項目をもう一度クリックします。ログインに成功したら、メニュー項目のタイトルを[ログアウト]に変更します。[ログイン]メニュー項目のタイトルを[ログアウト]に設定した後、クリックしても、ユーザーはすでにアクティオバーにタブを追加しないはずです。ログインしました。

ユーザーが正常にログインした部分まで動作するコードがあるため、ログインメニュー項目のタイトルがログアウトに変更されましたが、ユーザーが[ログアウト]をクリックしても、タブをクリックし、ログインフラグメントを表示します。

これを行う簡単な方法は、menuItem.getTitle()を実行し、menuItemの現在のタイトルに基づいてアクションを制限することです。しかし、これがこれを達成するための良い方法だとは思いません。そこで、フラグ「loginMenuItemFlag」を使用して、問題を解決しましたが、成功しませんでした。ログインメニュー項目のタイトルを変更してログアウトするまでは機能させることができましたが、ユーザーがログアウトをクリックすると、ログインタブが再度追加/表示されます。誰かが私が間違っていることを教えて、正しい方向に私を向けることができますか?ありがとうございます。

以下は、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();
        }
    }
}

}

以下は、ログイン操作が実行されている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();
    }

}

ありがとうございました。

4

1 に答える 1

0

onPrepareOptionsMenu()メニューを変更し、onOptionsItemSelectedメニュー項目のクリックを処理するために使用します。

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);
}
于 2013-01-30T04:50:59.187 に答える