Update a TextView in a ViewPager from another Fragment

前端 未结 4 1705
有刺的猬
有刺的猬 2021-01-07 17:23

I am trying to update a TextView in a Fragment clicking on a button on another Fragment.

Actually I implemented the callback function to the Activity and it does wor

4条回答
  •  挽巷
    挽巷 (楼主)
    2021-01-07 17:46

    SOLVED!

    Overriding instantiateItem() in TabsAdapter and adding the ViewPager as ContainerViewID in the FragmentTransaction made it!

    Here's the functioning whole FragmentActivity!

    import java.util.ArrayList;
    import android.app.Activity;
    import android.app.FragmentManager;
    import android.app.FragmentManager.OnBackStackChangedListener;
    import android.content.Context;
    import android.os.Build;
    import android.os.Bundle;
    import android.support.v4.app.ActionBar;
    import android.support.v4.app.Fragment;
    import android.support.v4.app.FragmentActivity;
    import android.support.v4.app.FragmentPagerAdapter;
    import android.support.v4.app.FragmentTransaction;
    import android.support.v4.app.ActionBar.Tab;
    import android.support.v4.app.SupportActivity;
    import android.support.v4.view.ViewPager;
    import android.util.Log;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.view.View.OnClickListener;
    import android.widget.TextView;
    
    /**
     * Demonstrates combining the action bar with a ViewPager to implement a tab UI
     * that switches between tabs and also allows the user to perform horizontal
     * flicks to move between the tabs.
     */
    public class ActionBarTabsPager extends FragmentActivity implements SecondFragment.OnButtonClickedXListener{
        ViewPager  mViewPager;
        TabsAdapter mTabsAdapter;
        FragmentManager fm;
    
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            Log.i("ONCREATE START","ONCREATE START");
    
    
            setContentView(R.layout.actionbar_tabs_pager);
    
    
            if (savedInstanceState == null) {
    
    
                Fragment newFragment = new FirstFragment();
                Fragment newFragment2 = new SecondFragment();
    
                FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
                ft.add(R.id.pager, newFragment, "FirstFragment");
                ft.add(R.id.pager, newFragment2, "SecondFragment");
                ft.commit();
    
    
           }
    
            getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    
            ActionBar.Tab tab1 = getSupportActionBar().newTab().setText("Fragment 1");
            ActionBar.Tab tab2 = getSupportActionBar().newTab().setText("Fragment 2");
            //ActionBar.Tab tab3 = getSupportActionBar().newTab().setText("Fragment 1");
            //ActionBar.Tab tab4 = getSupportActionBar().newTab().setText("Fragment 2");
    
            mViewPager = (ViewPager)findViewById(R.id.pager);
            mTabsAdapter = new TabsAdapter(this, getSupportActionBar(), mViewPager);
    
                mTabsAdapter.addTab(tab1, FirstFragment.class);
                mTabsAdapter.addTab(tab2, SecondFragment.class);//LoaderCursorSupport.CursorLoaderListFragment.class);
                //mTabsAdapter.addTab(tab3, FirstFragment.class);//LoaderCustomSupport.AppListFragment.class);
                //mTabsAdapter.addTab(tab4, SecondFragment.class);//LoaderThrottleSupport.ThrottledLoaderListFragment.class);
    
    
    
            if (savedInstanceState != null) {
                getSupportActionBar().setSelectedNavigationItem(savedInstanceState.getInt("index"));
            }
    
            Log.i("ONCREATE END","ONCREATE END");
    
        }
    
        @Override
        protected void onSaveInstanceState(Bundle outState) {
            Log.i("onSaveInstanceState START","onSaveInstanceState START");
            super.onSaveInstanceState(outState);
            outState.putInt("index", getSupportActionBar().getSelectedNavigationIndex());
            Log.i("onSaveInstanceState END","onSaveInstanceState END");
    
        }
    
        /**
         * This is a helper class that implements the management of tabs and all
         * details of connecting a ViewPager with associated TabHost.  It relies on a
         * trick.  Normally a tab host has a simple API for supplying a View or
         * Intent that each tab will show.  This is not sufficient for switching
         * between pages.  So instead we make the content part of the tab host
         * 0dp high (it is not shown) and the TabsAdapter supplies its own dummy
         * view to show as the tab content.  It listens to changes in tabs, and takes
         * care of switch to the correct paged in the ViewPager whenever the selected
         * tab changes.
         */
        public class TabsAdapter extends FragmentPagerAdapter implements ViewPager.OnPageChangeListener, ActionBar.TabListener {
            private final Context mContext;
            private final ActionBar mActionBar;
            private final ViewPager mViewPager;
            private final ArrayList mTabs = new ArrayList();
            private FragmentTransaction mCurTransaction = null;
    
    
            public TabsAdapter(FragmentActivity activity, ActionBar actionBar, ViewPager pager) {
                super(activity.getSupportFragmentManager());
                mContext = activity;
                mActionBar = actionBar;
                mViewPager = pager;
                mViewPager.setAdapter(this);
                mViewPager.setOnPageChangeListener(this);
    
    
            }
    
            public void addTab(ActionBar.Tab tab, Class clss) {
                Log.i("addTab","addTab");
    
                mTabs.add(clss.getName());
                mActionBar.addTab(tab.setTabListener(this));
                notifyDataSetChanged();
            }
    
            @Override
            public int getCount() {
                return mTabs.size();
            }
    
            @Override
            public Object instantiateItem(View container, int position) {
                if (mCurTransaction == null) {
                    mCurTransaction = getSupportFragmentManager().beginTransaction();
                }
                // TODO Auto-generated method stub
                Fragment fragment = getItem(position);
    
                if (fragment!=null){
                    Log.i("Fragment Found!","Fragment Found! "+fragment.getTag());
                    mCurTransaction.attach(fragment);
                    }
    
    
                return fragment;//super.instantiateItem(container, position);
            }
    
            @Override
            public Fragment getItem(int position) {
                Log.i("getItem","getItem");
    
                if (position==0)
                    {Log.i("position=0","position=0");
                    return getSupportFragmentManager().findFragmentByTag("FirstFragment");}
    
                else if (position==1)
                {Log.i("position=1","position=1");
                    return getSupportFragmentManager().findFragmentByTag("SecondFragment");}
    
                else return null;//Fragment.instantiate(mContext, mTabs.get(position), null);
    
            }
    
    
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            }
    
            @Override
            public void onPageSelected(int position) {
                mActionBar.setSelectedNavigationItem(position);
            }
    
            @Override
            public void onPageScrollStateChanged(int state) {
            }
    
            @Override
            public void onTabSelected(Tab tab, FragmentTransaction ft) {
                mViewPager.setCurrentItem(tab.getPosition());
    
            }
    
            @Override
            public void onTabReselected(Tab tab, FragmentTransaction ft) {
            }
    
            @Override
            public void onTabUnselected(Tab tab, FragmentTransaction ft) {
            }
    
    
        }
    
        @Override
        public void OnButtonClickedX(View v) {
    
            if (v==findViewById(R.id.button1)){
                Log.i("TRIGGERED","TRIGGERED");
    
                FirstFragment ff = (FirstFragment) getSupportFragmentManager().findFragmentByTag("FirstFragment");
    
                View root = ff.getView();
                TextView tv = (TextView) root.findViewById(R.id.textView1);
                Log.i("Text before Edit",""+tv.getText());
                      tv.setText("MODIFIED");
                      Log.i("Text after Edit",""+tv.getText());
    
    
    
    
            }
            // TODO Auto-generated method stub
    
        }
    
    
    
    
    
    }
    

    Thanks to vbsteven!

提交回复
热议问题