¿Cómo acceder a las vistas secundarias de Fragment dentro de la actividad principal de fragmento?

Tengo una actividad de fragmento soportado que cargará fragmentos de diff. El fragmento tiene algunos textView con id = "score" y quiero obtener su manejador, pero findViewById para el findViewById de puntaje devuelve nulo. ¿Porque?

textView se coloca en fragmento

 public class MyActivity extends extends ActionBarActivity implements NavigationDrawerFragment.NavigationDrawerCallbacks{ private TextView scoreBoardTextView = null; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_home); mNavigationDrawerFragment = (NavigationDrawerFragment) getSupportFragmentManager().findFragmentById(R.id.navigation_drawer); scoreBoardTextView = (TextView) findViewById(R.id.score); //this returns null } @Override public void onNavigationDrawerItemSelected(int position) { //set fragment } } 

Nota:

El acceso directo a las vistas del fragmento fuera del fragmento no es una buena idea. Debe utilizar interfaces de callback de fragmentos para manejar dichos casos y evitar errores. La siguiente forma funciona pero no se recomienda, ya que no es una buena práctica.


Si desea acceder al TextView of Fragment dentro de su Activity padre, entonces debe definir un método dentro de su clase Fragment esta manera:

 public class MyFragment extends Fragment { TextView mTextView; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.activity_main, container, false); mTextView = (TextView) view.findViewById(R.id.textView1); return view; } public void setTextViewText(String value){ mTextView.setText(value); } } 

Ahora puedes usar esto dentro de tu Activity así:

 myFragment.setTextViewText("foo"); 

aquí miFragmento es del tipo MyFragment .

Si desea acceder a todo el TextView , puede definir un método como este dentro de MyFragment.java :

 public TextView getTextView1(){ return mTextView; } 

De esta forma puede acceder al TextView mismo.

Espero que esto ayude. 🙂

Es posible con la siguiente manera:

Mantenga referencia de vista inflada en el Fragmento de esta manera:

 public class MyFragment extends SherlockFragment{ MainMenuActivity activity; public View view; public MyFragment(){ } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { if ( getActivity() instanceof MainMenuActivity){ activity = (MainMenuActivity) getActivity(); } view = inflater.inflate(R.layout.aboutus, container, false); return view; } } 

Crea una función en la Actividad, como esta:

  public class MainMenuActivity extends SherlockFragmentActivity { SherlockFragment fragment = null; public void switchContent(SherlockFragment fragment) { this.fragment = fragment; getSupportFragmentManager() .beginTransaction() .replace(R.id.mainmenu, fragment) .commit(); invalidateOptionsMenu(); } 

Su propósito es mantener la referencia del fragmento actual. Cuando quiera cambiar de fragmento, llame a la función anterior, así (del fragmento):

 activity.switchContent( new MyFragment_2()); 

Ahora tienes referencia de fragmento actual. Para que pueda acceder directamente a las vistas de Fragment en Activity como esta: this.fragment.view

No necesita la referencia de la vista Fragmento para obtener sus componentes en la Actividad . Como puede acceder directamente a los componentes de diseño de un Fragmento en la Actividad principal.

Simplemente puede acceder a cualquier componente mediante este

 findViewById(R.id.child_of_fragment_layout); 

Puede acceder con el método getView de la clase Fragment.

Por ejemplo, tiene un TextView en Your MyFragment con id de “text_view”
En tu actividad haz un fragmento tuyo:

 MyFragment myFragment = new MyFragment(); 

Y cuando necesite un niño, simplemente llame a getView y luego encuentre Your childView.

 View view = myFragment.getView(); if (view !=null) { view.findViewById(R.id.text_view).setText("Child Accessed :D"); } 

Para acceder a TextView o Button o lo que sea en su fragmento, debe hacer lo siguiente:

 public class BlankFragment extends Fragment { public View view; public TextView textView; public Button button; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment view =inflater.inflate(R.layout.fragment_blank, container, false); textView = (TextView)view.getRootView().findViewById(R.id.textView_fragment1); return view; } public void changeTextOfFragment(String text){ textView.setText(text); view.setBackgroundResource(R.color.colorPrimaryDark); } 

Una vez hecho esto en su MainActivity o en cualquier otro lugar en el que desee acceder a su TextView desde su Fragment, debe asegurarse de configurar el fragmento en su método OnCreate () de otra manera, probablemente arroje nullPointer. Por lo tanto, su actividad en la que desee cambiar el TextView debería verse así:

 public class MainActivity extends AppCompatActivity { private Button button1; private FragmentManager fragmentManager; private FragmentTransaction fragmentTransaction; BlankFragment blankFragment = new BlankFragment(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button1 = (Button)findViewById(R.id.button1); changeFragment(); fragmentManager = getFragmentManager(); fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.replace(R.id.fragment1,blankFragment); fragmentTransaction.commit(); } private void changeFragment(){ button1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { blankFragment.changeTextOfFragment("Enter here the text which you want to be displayed on your Updated Fragment"); } }); } 

Espero que esto ayude 🙂

Solo ponga en fragmento en lugar de poner en actividad:

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_new_work_order, container, false); TextView scoreBoardTextView = (TextView) rootView.findViewById(R.id.score); return rootView; } 

Si su TextView se coloca dentro de Fragment, caso en que no pueda acceder a TextView dentro de Fragment Parent Activity , puede configurar la interfaz para la intercomunicación entre Fragment y Activity y enviar datos al hacer clic en TextView o en cualquier otra cosa que desee que ocurra.

Solo haciendo esto:

 ((Your_Activity) this.getActivity()).YouyActivityElements; 

La puntuación textView está en el diseño del fragmento, no está en el diseño de MyActivity, es decir, R.layout.activity_home. De modo que podría encontrar la vista de texto de puntuación en ese fragmento una vez que haya inflado el archivo de diseño correspondiente.

Devuelve null porque TextView es un elemento del Fragment , no de la Activity .

Tenga en cuenta que la idea de usar Fragment es encapsular un módulo dentro del Fragment , lo que significa que la Activity no debería tener acceso directo a sus propiedades. Considere mover su lógica donde obtiene la referencia de TextView dentro del Fragment

No puede acceder al elemento Fragment en la Activity , pero puede pasar valores a su Fragment de la siguiente manera.

en su método onNavigationDrawerItemSelected de MyActivity haga lo siguiente

 int myScore = 100; @Override public void onNavigationDrawerItemSelected(int position) { // update the main content by replacing fragments FragmentManager fragmentManager = getSupportFragmentManager(); fragmentManager .beginTransaction() .replace(R.id.container, MyFragment.newInstance(myScore)).commit(); } 

Y en la clase MyFragment , crea un método llamado newInstance como el siguiente

 private static final String SCORE = "score"; public static MyFragment newInstance(int score) { MyFragment fragment = new MyFragment(); Bundle args = new Bundle(); args.putInt(SCORE, score); fragment.setArguments(args); return fragment; } 

Y en el MyFragment onCreateView()

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_main, container, false); TextView textView = (TextView) rootView .findViewById(R.id.score); textView.setText(Integer.toString(getArguments().getInt( SCORE))); return rootView; } 

Eso es todo, espero que esto te ayude. Si no es así, por favor hágamelo saber.

Simplemente declare TextView como público en fragmento, inícielo mediante findViewById () en el fragmento onCreateView (). Ahora, al usar el objeto Fragment que agregó en la actividad, puede acceder a TextView.

Debe llamar al método findViewById desde su vista de fragmento.

 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_home); mNavigationDrawerFragment = (NavigationDrawerFragment) getSupportFragmentManager().findFragmentById(R.id.navigation_drawer); scoreBoardTextView = (TextView) mNavigationDrawerFragment.getView().findViewById(R.id.score); } 

De esta manera me funciona.

Te sugiero que hagas que la vista de texto sea parte del diseño de tu actividad. Alternativamente, puede tener la vista de texto como un fragmento separado. Eche un vistazo a mi pregunta aquí. Es similar a la tuya pero en dirección inversa. Aquí hay una versión reducida del código que utilicé en mi proyecto. La explicación está a lo largo del código.

La clase de actividad

 public class MainActivity extends ActionBarActivity { PlaceFragment fragment; TextView fragmentsTextView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override protected void onStart() { // TODO Auto-generated method stub super.onStart(); Bundle bundle = new Bundle(); bundle.putString("score", "1000"); fragment = PlaceFragment.newInstance(bundle); FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); ft.replace(R.id.container, fragment); ft.addToBackStack(null); ft.commit(); // method 1 // fragment is added some ways to access views // get the reference of fragment's textview if (fragment.getTextView() != null) { fragmentsTextView = fragment.getTextView(); } // method 2 // using static method dont use in production code // PlaceFragment.textViewInFragment.setText("2000"); // method 3 // let the fragment handle update its own text this is the recommended // way wait until fragment transaction is complete before calling //fragment.updateText("2000"); } } 

La clase de fragmento:

 public class PlaceFragment extends Fragment { public TextView textViewInFragment;// to access via object.field same to // string.length // public static TextView textViewInFragment;//to access via // PlaceFragment.textView dont try this in production code public PlaceFragment() { } public static PlaceFragment newInstance(Bundle bundle) { PlaceFragment fragment = new PlaceFragment(); fragment.setArguments(bundle); return fragment; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // TODO Auto-generated method stub View view = inflater.inflate(R.layout.fragment_place, container, false); textViewInFragment = (TextView) view .findViewById(R.id.textViewInFragment); return view; } @Override public void onStart() { // TODO Auto-generated method stub super.onStart(); if (getArguments() != null) { textViewInFragment.setText(getArguments().getString("score")); } } public TextView getTextView() { if (textViewInFragment != null) { return textViewInFragment;// returns instance of inflated textview } return null;// return null and check null } public void updateText(String text) { textViewInFragment.setText(text);// this is recommended way to alter // view property of fragment in // activity } } 

La comunicación de la actividad al fragmento es directa. Esto se debe a que la actividad contiene fragmentos. Guarde el objeto fragmento y acceda a su propiedad a través de setters y getters o los campos públicos dentro de él. Pero la comunicación de fragmento a actividad requiere una interfaz.

por qué no accede directamente desde su FragmentPagerAdapter,

 SubAccountFragment subAccountFragment = (SubAccountFragment) mSectionsPagerAdapter.getItem(1); subAccountFragment.requestConnectPressed(view); 

y aquí está el ejemplo completo:

 import android.content.Intent; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.app.FragmentTransaction; import android.support.v4.view.ViewPager; import android.support.v7.app.ActionBar; import android.support.v7.app.ActionBarActivity; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.ImageView; import android.widget.TextView; import java.util.Locale; public class TabsActivity extends ActionBarActivity implements ActionBar.TabListener { /** * The {@link android.support.v4.view.PagerAdapter} that will provide * fragments for each of the sections. We use a * {@link FragmentPagerAdapter} derivative, which will keep every * loaded fragment in memory. If this becomes too memory intensive, it * may be best to switch to a * {@link android.support.v4.app.FragmentStatePagerAdapter}. */ SectionsPagerAdapter mSectionsPagerAdapter; /** * The {@link ViewPager} that will host the section contents. */ ViewPager mViewPager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_tabs); // Set up the action bar. final ActionBar actionBar = getSupportActionBar(); actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); // Create the adapter that will return a fragment for each of the three // primary sections of the activity. mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); // Set up the ViewPager with the sections adapter. mViewPager = (ViewPager) findViewById(R.id.pager); mViewPager.setAdapter(mSectionsPagerAdapter); // When swiping between different sections, select the corresponding // tab. We can also use ActionBar.Tab#select() to do this if we have // a reference to the Tab. mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { @Override public void onPageSelected(int position) { actionBar.setSelectedNavigationItem(position); } }); // For each of the sections in the app, add a tab to the action bar. for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) { // Create a tab with text corresponding to the page title defined by // the adapter. Also specify this Activity object, which implements // the TabListener interface, as the callback (listener) for when // this tab is selected. ActionBar.Tab tab = actionBar.newTab(); View tabView = this.getLayoutInflater().inflate(R.layout.activity_tab, null); ImageView icon = (ImageView) tabView.findViewById(R.id.tab_icon); icon.setImageDrawable(getResources().getDrawable(mSectionsPagerAdapter.getPageIcon(i))); TextView title = (TextView) tabView.findViewById(R.id.tab_title); title.setText(mSectionsPagerAdapter.getPageTitle(i)); tab.setCustomView(tabView); tab.setTabListener(this); actionBar.addTab(tab); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_tabs, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_logout) { finish(); gotoLogin(); return true; } return super.onOptionsItemSelected(item); } @Override public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { // When the given tab is selected, switch to the corresponding page in // the ViewPager. mViewPager.setCurrentItem(tab.getPosition()); } @Override public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { } @Override public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { } /** * A {@link FragmentPagerAdapter} that returns a fragment corresponding to * one of the sections/tabs/pages. */ public class SectionsPagerAdapter extends FragmentPagerAdapter { public ProfileFragment profileFragment; public SubAccountFragment subAccountFragment; public ChatFragment chatFragment; public SectionsPagerAdapter(FragmentManager fm) { super(fm); profileFragment = new ProfileFragment(); subAccountFragment = new SubAccountFragment(); chatFragment = new ChatFragment(); } @Override public Fragment getItem(int position) { switch (position) { case 0: return profileFragment; case 1: return subAccountFragment; case 2: return chatFragment; } return null; } @Override public int getCount() { // Show 3 total pages. return 3; } @Override public CharSequence getPageTitle(int position) { Locale l = Locale.getDefault(); switch (position) { case 0: return getString(R.string.title_section1).toUpperCase(l); case 1: return getString(R.string.title_section2).toUpperCase(l); case 2: return getString(R.string.title_section3).toUpperCase(l); } return null; } public int getPageIcon(int position) { switch (position) { case 0: return R.drawable.tab_icon_0; case 1: return R.drawable.tab_icon_1; case 2: return R.drawable.tab_icon_2; } return 0; } } public void gotoLogin() { Intent intent = new Intent(this, LoginActivity.class); this.startActivity(intent); } public void requestConnectPressed(View view){ SubAccountFragment subAccountFragment = (SubAccountFragment) mSectionsPagerAdapter.getItem(1); subAccountFragment.requestConnectPressed(view); } } 

Si la vista ya está inflada (por ejemplo, visible) en la pantalla, puede usar findViewById (R.id.yTextView) dentro de la actividad de forma normal y devolverá el manejador a la vista de texto o null si no se encontró la vista.