如何改变从按钮点击ABS选项卡,而无需使用TabHost? [英] How to change ABS tab from button click without using TabHost?

查看:168
本文介绍了如何改变从按钮点击ABS选项卡,而无需使用TabHost?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我开始了,这是我的第一篇文章。任何帮助将大大AP preciated!

我已经成功实施了ABS标签。我想从另一个选项卡中单击按钮更改选项卡,并重新加载片段的活性。从搜索的帖子,似乎每个人都使用TabHost做到了这一点。有没有办法做到这一点不TabHost?

请查看我愿做图的画面: http://i.imgur.com/ wwDBj.png

请参见下面的MainActivity code:

 公共类MainActivity扩展SherlockFragmentActivity {私人INT tabSelected = 0;
@覆盖
公共无效的onCreate(捆绑savedInstanceState){
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.activity_main);
            。getSupportActionBar()setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
            getSupportActionBar()。addTab(
                    getTab(新TabListener< FragmenOne>(这一点,FragmenOne.class
                            .getName(),FragmenOne.class),塔伯恩));
            getSupportActionBar()。addTab(
                    getTab(新TabListener< FragmenTwo>(这一点,FragmenTwo.class
                            .getName(),FragmenTwo.class),TabTwo));
            getSupportActionBar()。addTab(
                    getTab(新TabListener< FragmenThree>(这一点,FragmenThree.class
                            .getName(),FragmenThree.class),TabThree));
}私人标签getTab(TabListener监听器,串标题){
    ActionBar.Tab标签= getSupportActionBar()newTab()。
    tab.setTabListener(监听);
    tab.setText(职称);
    返回标签;
}公共类TabListener<吨延伸片断>器物
ActionBar.TabListener {
    私人最终SherlockFragmentActivity mActivity;
    私人最终字符串MTAG;
    私人最终级< T> mClass;
    私人最终捆绑mArgs;
    公共片段mFragment;    公共TabListener(SherlockFragmentActivity活动,串标,
            类< T> CLZ){
        这个(活动,吊牌,CLZ,NULL);
    }    公共TabListener(SherlockFragmentActivity活动,串标,
            类< T> CLZ,捆绑参数){
        mActivity =活动;
        MTAG =标签;
        mClass = CLZ;
        mArgs = ARGS;        mFragment = mActivity.getSupportFragmentManager()
                .findFragmentByTag(标签);
        如果(mFragment =空&放大器;!&放大器;!mFragment.isDetached()){
            FragmentTransaction英尺= mActivity.getSupportFragmentManager()
                    .beginTransaction();
            ft.detach(mFragment);
            ft.commit();
        }
    }    @覆盖
    公共无效onTabSelected(标签选项卡,FragmentTransaction英尺){
                        如果(tab.getPosition()== 0)
                        {
                            tabSelected = 0;
                            FragmenOne FRAG =新FragmenOne();
                            ft.replace(android.R.id.content,FRAG);
                        }
                        否则如果(tab.getPosition()== 1)
                        {
                            tabSelected = 1;
                            FragmenTwo FRAG =新FragmenTwo();
                            项= 1;
                            invalidateOptionsMenu();
                            ft.replace(android.R.id.content,FRAG);
                        }
                        否则如果(tab.getPosition()== 2)
                        {
                            tabSelected = 2;
                            FragmenThree FRAG =新FragmenThree();
                            ft.replace(android.R.id.content,FRAG);
                        }
    }
    @覆盖
    公共无效onTabUnselected(标签选项卡,FragmentTransaction英尺){
        如果(mFragment!= NULL){
            ft.detach(mFragment);
            项= 0;
            invalidateOptionsMenu();
        }    }    @覆盖
    公共无效onTabReselected(标签选项卡,FragmentTransaction英尺){    }
}公共无效setCurrentItem(){    FragmentTransaction英尺= getSupportFragmentManager()调用BeginTransaction()。
    FragmenTwo FRAG =新FragmenTwo();
    ft.replace(android.R.id.content,FRAG);
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
    ft.commit();}

下面是从其他活动code,我想点击一个按钮来加载例如TAB2

 公共类TabThree扩展活动实现OnItemSelectedListener {//添加按钮
按钮btnAdd;@覆盖
公共无效的onCreate(捆绑savedInstanceState){
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.tabthree);    //添加按钮
    btnAdd =(按钮)findViewById(R.id.button);    btnAdd.setOnClickListener(新View.OnClickListener(){        @覆盖
        公共无效的onClick(查看为arg0){
        //什么在这里写??????        }
    });
}


解决方案

试试这个办法是最好的办法了,你应该使用

第一步:创建接口 TabThree 类像这样

  //监听器,我们通知被点击按钮时
OnNotifyButtonClickedListener mOnNotifyButtonClickedListener = NULL;/ **
 *重新presents将通知选项卡选择的侦听器。
 * /
公共接口OnNotifyButtonClickedListener {    公共无效OnNotifyButtonClicked();
}
/ **
 *设置应该通知选项卡选择事件监听器。
 *
 * @参数监听器
 *听者通知。
 * /
公共无效setOnNotifyButtonClickedListener(
        OnNotifyButtonClickedListener监听){
    mOnNotifyButtonClickedListener =侦听器;
}

第二步:实现了 MainActivity 类像

 公共类MainActivity扩展SherlockFragmentActivity
        器物
        TabThree.OnNotifyButtonClickedListener {
}

第三步::点击您btnAdd按钮在 TabThree类

  btnAdd =(按钮)findViewById(R.id.button);btnAdd.setOnClickListener(新View.OnClickListener(){    @覆盖
    公共无效的onClick(查看为arg0){       mOnNotifyButtonClickedListener.OnNotifyButtonClicked();    }
});

第四步::使用您的code&放;从 TabThree类

更改标签

  @覆盖
    公共无效OnNotifyButtonClicked(){    //这里把你的标签选择code。    }

&安培;去年主要的事情不要忘记注册界面如同

  FragmenThree mFragment =新FragmenThree();
    mFragment.setOnNotifyButtonClickedListener(本);

编辑:你的情况,注册这样

  mFragment = mActivity.getSupportFragmentManager()
                .findFragmentByTag(标签);
        如果(mFragment =空&放大器;!&放大器;!mFragment.isDetached()){            mFragment.setOnNotifyButtonClickedListener(本);
            FragmentTransaction英尺= mActivity.getSupportFragmentManager()
                    .beginTransaction();
            ft.detach(mFragment);
            ft.commit();
        }

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

这篇关于如何改变从按钮点击ABS选项卡,而无需使用TabHost?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆