简体   繁体   中英

How to change ABS tab from button click without using TabHost?

I am starting out and this is my first post. Any help will be greatly appreciated!

I have successfully implemented tabs with ABS. I would like to change tabs and reload the fragment activity from a button click in another tab. From searching posts it seems everyone has done this using TabHost. Is there any way to do this without TabHost?

Please see diagram picture of what I would like to do: http://i.imgur.com/wwDBj.png

Please see code below of MainActivity:

public class MainActivity extends SherlockFragmentActivity {

private int tabSelected = 0;


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


            getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);


            getSupportActionBar().addTab(
                    getTab(new TabListener<FragmenOne>(this, FragmenOne.class
                            .getName(), FragmenOne.class), "TabOne"));
            getSupportActionBar().addTab(
                    getTab(new TabListener<FragmenTwo>(this, FragmenTwo.class
                            .getName(), FragmenTwo.class), "TabTwo"));
            getSupportActionBar().addTab(
                    getTab(new TabListener<FragmenThree>(this, FragmenThree.class
                            .getName(), FragmenThree.class), "TabThree"));
}

private Tab getTab(TabListener listener, String title) {
    ActionBar.Tab tab = getSupportActionBar().newTab();
    tab.setTabListener(listener);
    tab.setText(title);
    return tab;
}

public class TabListener<T extends Fragment> implements
ActionBar.TabListener {
    private final SherlockFragmentActivity mActivity;
    private final String mTag;
    private final Class<T> mClass;
    private final Bundle mArgs;
    public Fragment mFragment;

    public TabListener(SherlockFragmentActivity activity, String tag,
            Class<T> clz) {
        this(activity, tag, clz, null);
    }

    public TabListener(SherlockFragmentActivity activity, String tag,
            Class<T> clz, Bundle args) {
        mActivity = activity;
        mTag = tag;
        mClass = clz;
        mArgs = args;

        mFragment = mActivity.getSupportFragmentManager()
                .findFragmentByTag(tag);
        if (mFragment != null && !mFragment.isDetached()) {
            FragmentTransaction ft = mActivity.getSupportFragmentManager()
                    .beginTransaction();
            ft.detach(mFragment);
            ft.commit();
        }


    }

    @Override
    public void onTabSelected(Tab tab, FragmentTransaction ft) {


                        if(tab.getPosition()==0)
                        {
                            tabSelected = 0;
                            FragmenOne frag = new FragmenOne();
                            ft.replace(android.R.id.content, frag);     
                        }
                        else if(tab.getPosition()==1)
                        {
                            tabSelected = 1;
                            FragmenTwo frag = new FragmenTwo();
                            items = 1;
                            invalidateOptionsMenu();
                            ft.replace(android.R.id.content, frag);
                        }
                        else if(tab.getPosition()==2)
                        {
                            tabSelected = 2;
                            FragmenThree frag = new FragmenThree();
                            ft.replace(android.R.id.content, frag);
                        }


    }


    @Override
    public void onTabUnselected(Tab tab, FragmentTransaction ft) {
        if (mFragment != null) {
            ft.detach(mFragment);
            items = 0;
            invalidateOptionsMenu();
        }

    }

    @Override
    public void onTabReselected(Tab tab, FragmentTransaction ft) {

    }
}

public void setCurrentItem() {

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    FragmenTwo frag = new FragmenTwo();
    ft.replace(android.R.id.content, frag);
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
    ft.commit();

}

Here is code from the other activity where I would like a button click to load a tab2 for example

public class TabThree extends Activity  implements OnItemSelectedListener {

// Add button
Button btnAdd;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.tabthree);

    // add button
    btnAdd = (Button) findViewById(R.id.button);



    btnAdd.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {


        //What to write here??????

        }
    });
}

Try this way It is best approach for you should use

First step : Create InterFace in TabThree Class Like this.

// The listener we are to notify when a Button is clicked
OnNotifyButtonClickedListener mOnNotifyButtonClickedListener = null;

/**
 * Represents a listener that will be notified of tab selections.
 */
public interface OnNotifyButtonClickedListener {

    public void OnNotifyButtonClicked();
}
/**
 * Sets the listener that should be notified of tab selection events.
 * 
 * @param listener
 *            the listener to notify.
 */
public void setOnNotifyButtonClickedListener(
        OnNotifyButtonClickedListener listener) {
    mOnNotifyButtonClickedListener = listener;
}

Second Step : Implements in MainActivity Class Like.

public class MainActivity extends SherlockFragmentActivity
        implements
        TabThree.OnNotifyButtonClickedListener{
}

Third step : Click your btnAdd Button in TabThree Class

btnAdd = (Button) findViewById(R.id.button);

btnAdd.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View arg0) {

       mOnNotifyButtonClickedListener.OnNotifyButtonClicked();

    }
});

Fourth step: use Your code & change your tab from TabThree Class

@Override
    public void OnNotifyButtonClicked() {       

    // Put your tab selection code here.

    }

& Last main thing Dont forget to Register interface Like

   FragmenThree mFragment= new FragmenThree();
    mFragment.setOnNotifyButtonClickedListener(this);

EDIT : in your case Register this way

   mFragment = mActivity.getSupportFragmentManager()
                .findFragmentByTag(tag);
        if (mFragment != null && !mFragment.isDetached()) {

            mFragment.setOnNotifyButtonClickedListener(this);
            FragmentTransaction ft = mActivity.getSupportFragmentManager()
                    .beginTransaction();
            ft.detach(mFragment);
            ft.commit();
        }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM