[英]How to change the fragment of a Tab with a new fragment on the same tab with ActionBarSherlock
I having problem with this awesome library. 我对这个很棒的图书馆有疑问。 I have a MainActivity with 4 tabs:
我有一个带有4个标签的MainActivity:
public class MainActivity extends SherlockFragmentActivity {
// Declare Variables
ActionBar mActionBar;
ViewPager mPager;
Tab tab;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Get the view from activity_main.xml
SharedPreferences pref= getSharedPreferences("wizard", 0);
SharedPreferences.Editor editor = pref.edit();
String isOkWizard= pref.getString("isOkWizard", null); //prelevo lo stato dello wizard
if(isOkWizard!=null){
//abilita tutto
}else{
Toast.makeText(this, ""
}
setContentView(R.layout.activity_main);
//toggleFullscreen(true);
// setTheme(R.style.Theme_Sherlock_NoActionBar);
// Activate Navigation Mode Tabs
mActionBar = getSupportActionBar();
mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
// Locate ViewPager in activity_main.xml
mPager = (ViewPager) findViewById(R.id.pager);
// Activate Fragment Manager
FragmentManager fm = getSupportFragmentManager();
// Capture ViewPager page swipes
ViewPager.SimpleOnPageChangeListener ViewPagerListener = new ViewPager.SimpleOnPageChangeListener() {
@Override
public void onPageSelected(int position) {
super.onPageSelected(position);
// Find the ViewPager Position
mActionBar.setSelectedNavigationItem(position);
}
};
mPager.setOnPageChangeListener(ViewPagerListener);
// Locate the adapter class called ViewPagerAdapter.java
ViewPagerAdapter viewpageradapter = new ViewPagerAdapter(fm);
// Set the View Pager Adapter into ViewPager
mPager.setAdapter(viewpageradapter);
// Capture tab button clicks
ActionBar.TabListener tabListener = new ActionBar.TabListener() {
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
// Pass the position on tab click to ViewPager
mPager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
// TODO Auto-generated method stub
}
@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
// TODO Auto-generated method stub
}
};
// Create first Tab
tab = mActionBar.newTab().setText("Tab1").setTabListener(tabListener);
mActionBar.addTab(tab);
// Create second Tab
tab = mActionBar.newTab().setText("Tab2").setTabListener(tabListener);
mActionBar.addTab(tab);
// Create third Tab
tab = mActionBar.newTab().setText("Tab3").setTabListener(tabListener);
mActionBar.addTab(tab);
// Create 4 Tab
tab = mActionBar.newTab().setText("Tab4").setTabListener(tabListener);
mActionBar.addTab(tab);
}
Now in the first tab I have a the Fragment1 with 5 buttons that open a new fragment. 现在在第一个选项卡中,我有一个Fragment1,其中有5个按钮可打开一个新片段。 My problem is to replace this fragment with the new called from the button listener.
我的问题是用从按钮侦听器调用的新片段替换此片段。 This my fragment1 for the first tab:
这是我的第一个标签的fragment1:
public class FragmentTab1 extends SherlockFragment {
static Context context;
@Override
public SherlockFragmentActivity getSherlockActivity() {
return super.getSherlockActivity();
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Get the view from fragmenttab1.xml
// View view = inflater.inflate(R.layout.fragmenttab1, container, false);
RelativeLayout view = (RelativeLayout) inflater.inflate(R.layout.fragmenttab1,
container, false);
context=getActivity();
Button guasti = (Button) view.findViewById(R.id.bGuasti);
Button segnala = (Button) view.findViewById(R.id.segnalaDisservizio);
guasti.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
Fragment newFragment = new FragmentTab2();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack
transaction.replace(R.id.fragment1, newFragment);
transaction.addToBackStack(null);
// Commit the transaction
transaction.commit();
}
});
segnala.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(hasConnection()){
Intent i= new Intent(getActivity(), SegnalaDisservizioActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
startActivity(i);
}else{
Toast.makeText(context, "Devi avere una connessione attiva per usurfruire del servizio", 3000).show();
}
}
});
return view;
}
public static boolean hasConnection() {
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo wifiNetwork = cm
.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
if (wifiNetwork != null && wifiNetwork.isConnected()) {
return true;
}
NetworkInfo mobileNetwork = cm
.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
if (mobileNetwork != null && mobileNetwork.isConnected()) {
return true;
}
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
if (activeNetwork != null && activeNetwork.isConnected()) {
return true;
}
return false;
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
setUserVisibleHint(true);
}
I believe you have all your 5 fragments are being managed from ViewPagerAdapter
. 我相信您的所有5个片段都可以通过
ViewPagerAdapter
进行管理。
In your activity define a public method like 在您的活动中定义一个公共方法,例如
//tabNumber from 0 to 4
public void nextPage(int tabNumber)
{
mPager.setCurrentItem(tabNumber);
}
and from your fragment, call 然后从您的片段中调用
int tab =1; //or any number
MainActivity mainActivity = (MainActivity)getActivity();
mainActivity.nextPage(tab);
Your fragment will automatically move to the specified number. 您的片段将自动移至指定编号。
I suggest you download view pager demo app from JakeWharton here and the source code for the same here . 我建议你下载从JakeWharton视图寻呼机演示应用程序在这里和源代码相同的位置 。 Next time when you are stuck you can simply check the app for required functionality and learn from the master himself.
下次当您陷入困境时,您只需检查该应用程序的必需功能,并向船长学习即可。
Edit!!! 编辑!!!
If you want to replace the fragment altogether, you should manage that either in the adapter or you shouldn't be using view pager. 如果要完全替换该片段,则应在适配器中进行管理,或者不应该使用View pager。
For fragment demos, check this app and the source code here 有关片段演示,请在此处查看此应用和源代码
Check if this question matches what you want. 检查此问题是否符合您的要求。 In any case, try to make your question as clear as possible.
无论如何,请尝试使您的问题尽可能清楚。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.