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.