简体   繁体   English

如何使用ActionBarSherlock在同一选项卡上使用新片段更改选项卡的片段

[英]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.

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