简体   繁体   English

如何在不使用TabHost的情况下从按钮单击更改ABS选项卡?

[英]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. 我已经使用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. 通过搜索帖子,似乎每个人都使用TabHost做到了这一点。 Is there any way to do this without TabHost? 没有TabHost,有没有办法做到这一点?

Please see diagram picture of what I would like to do: http://i.imgur.com/wwDBj.png 请查看我想做什么的图表图片: http : //i.imgur.com/wwDBj.png

Please see code below of MainActivity: 请参见下面的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 这是其他活动的代码,例如,我希望单击按钮以加载tab2

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. 第一步:像这样在TabThree类中创建接口

// 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. 第二步:MainActivity类中实现。

public class MainActivity extends SherlockFragmentActivity
        implements
        TabThree.OnNotifyButtonClickedListener{
}

Third step : Click your btnAdd Button in TabThree Class 第三步:TabThree Class单击您的btnAdd按钮

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 第四步:使用您的代码并从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();
        }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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