Aggiorna un TextView in un ViewPager da un altro frammento

Sto provando ad aggiornare un TextView in un frammento facendo clic su un button su un altro frammento.

In realtà ho implementato la function di richiamata all'attività e funziona, poiché il Logcat riport che il text in TextView è stato modificato. Il problema è che la Textview visualizzata nel primo frammento non viene aggiornata al nuovo valore! È come se il frammento deve essere aggiornato o qualcosa …

  • Come hide il browser quando si sta per essere mostrato momentaneamente - Android
  • l'elemento use-sdk non può avere un attributo "tools: node"
  • Disegnare Android utilizzando SurfaceView e Thread
  • Mono Android. Unità di test dell'unità
  • Stile android spinner
  • Come autenticare gli utenti dal servizio web di sharepoint 2013 e dalla directory triggers
  • Ecco il codice di attività ActionBarTabsPager:

    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); setContentView(R.layout.actionbar_tabs_pager); if (savedInstanceState == null) { Fragment newFragment = new FirstFragment(); FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); ft.add(R.id.abs__custom, newFragment, "FirstFragment").commit(); Fragment newFragment2 = new FirstFragment(); FragmentTransaction ft2 = getSupportFragmentManager().beginTransaction(); ft2.add(R.id.abs__custom, newFragment2, "SecondFragment").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")); } } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putInt("index", getSupportActionBar().getSelectedNavigationIndex()); } /** * 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<String> mTabs = new ArrayList<String>(); 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) { mTabs.add(clss.getName()); mActionBar.addTab(tab.setTabListener(this)); notifyDataSetChanged(); } @Override public int getCount() { return mTabs.size(); } @Override public Fragment getItem(int position) { return 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 } } 

    FirstFragment:

     import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; public class FirstFragment extends Fragment { int mNum; /** * Create a new instance of FirstFragment, providing "num" * as an argument. */ static FirstFragment newInstance(int num) { FirstFragment f = new FirstFragment(); // Supply num input as an argument. Bundle args = new Bundle(); args.putInt("num", num); f.setArguments(args); return f; } /** * When creating, retrieve this instance's number from its arguments. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mNum = getArguments() != null ? getArguments().getInt("num") : 1; } /** * The Fragment's UI is just a simple text view showing its * instance number. */ @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.myfrag1, container, false); return v; } } 

    SecondFragment:

     import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.SupportActivity; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; public class SecondFragment extends Fragment { int mNum; OnButtonClickedXListener mListener; /** * Create a new instance of CountingFragment, providing "num" * as an argument. */ static SecondFragment newInstance(int num) { SecondFragment f = new SecondFragment(); // Supply num input as an argument. Bundle args = new Bundle(); args.putInt("num", num); f.setArguments(args); return f; } /** * When creating, retrieve this instance's number from its arguments. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mNum = getArguments() != null ? getArguments().getInt("num") : 1; } /** * The Fragment's UI is just a simple text view showing its * instance number. */ @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.myfrag2, container, false); View button1 = v.findViewById(R.id.button1); button1.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mListener.OnButtonClickedX(v); // TODO Auto-generated method stub } }); return v; } public interface OnButtonClickedXListener{ public void OnButtonClickedX(View v); } @Override public void onAttach(SupportActivity activity) { // TODO Auto-generated method stub super.onAttach(activity); try { mListener = (OnButtonClickedXListener) activity; } catch (ClassCastException e) { throw new ClassCastException(activity.toString() + " must implement OnButtonClickedXListener"); } } } 

    myfrag1.xml:

     <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/textView1" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center" android:text="No String" android:textAppearance="?android:attr/textAppearanceLarge" /> </LinearLayout> 

    myfrag2.xml:

     <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <Button android:id="@+id/button1" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center" android:gravity="center" android:text="Button" /> </LinearLayout> 

    EDIT:

    Anche passando a 0 il ContainerViewId in ft.add () non ha alcun impatto sul rendering finale. Quindi suppongo che il rendering sia gestito da

     mTabsAdapter.addTab(tab1, FirstFragment.class); mTabsAdapter.addTab(tab2, SecondFragment.class); 

    Il problema è comunque uguale.

    Ecco actionbar_tabs_pager.xml

     <?xml version="1.0" encoding="utf-8"?> <android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/pager" android:layout_width="fill_parent" android:layout_height="fill_parent" /> 

  • L'apertura del Firebase Deep-link riproduce anche quando l'applicazione è installata
  • Android: utilizzo di WebView al di fuori di un context di attività
  • SearchView con più frammenti che utilizzano viewpager in android
  • Tempo di inattività dell'applicazione
  • Interfaccia utente distorta sull'Receive di annunci AdMob
  • funzionalità adattatore di sincronizzazione a nido d'ape per la modifica dei contatti
  • 4 Solutions collect form web for “Aggiorna un TextView in un ViewPager da un altro frammento”

    Risolto!

    L'override di istantiateItem () in TabsAdapter e l'aggiunta di ViewPager come ContainerViewID nella FragmentTransaction lo ha reso!

    Ecco l'integer FragmentActivity funzionante!

     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<String> mTabs = new ArrayList<String>(); 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 } } 

    Grazie a vbsteven!

    Suppongo che i frammenti che vedete sullo schermo non sono i frammenti che aggiungete manualmente con i tag "FirstFragment" e "SecondFragment" ma invece i frammenti che vengono aggiunti dal metodo getItem del tuo TabsAdapter.

    Se si guarda alla sua implementazione, esso crea istanze di nuovi frammenti.

      @Override public Fragment getItem(int position) { return Fragment.instantiate(mContext, mTabs.get(position), null); } 

    Questi frammenti di nuova creazione vengono aggiunti a FragmentManager con tag personalizzati generati in FragmentPagerAdapter (che estende TabsAdapter)

    La mia ipotesi è che questo sia il caso di frammenti "sovrapposti" – non rari a coloro che cercano frammenti per la prima volta. Ogni volta che riesci a visualizzare un frammento (visualizza un frammento, mostra un'altra, torna al primo frammento visualizzato), stai creando un nuovo frammento dietro il frammento visibile. Il "frammento di specchio" rimane in cima, bloccando la vista del frammento dietro. Solo scorrendo quel frammento vednetworking che il frammento dietro veramente si aggiorna.

    La maggior parte del tempo è solo un caso di ripetere quello che hai fatto in XML nel tuo FragmentActivity. Inserisci il tuo layout xml in modo che i fram pro possano diagnosticare meglio il tuo problema.

    Inserisci anche actionbar_tabs_pager.xml.

    Non so se risolve i tuoi problemi ma in questa parte del tuo codice aggiunti FirstFragment () per entrambi i frammenti …

     Fragment newFragment = new FirstFragment(); FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); ft.add(R.id.abs__custom, newFragment, "FirstFragment").commit(); Fragment newFragment2 = new FirstFragment(); FragmentTransaction ft2 = getSupportFragmentManager().beginTransaction(); ft2.add(R.id.abs__custom, newFragment2, "SecondFragment").commit(); 

    … e potresti scrivere più semplice:

     FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); ft.add(R.id.abs__custom, newFragment, "FirstFragment"); ft.add(R.id.abs__custom, newFragment2, "SecondFragment"); ft.commit(); 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.