2012-07-31 17 views
17

tengo una actividad que hace una transacción fragmentoAndroid: Fragmento no puede realizar actividad

DetailFragment newFragment = new DetailFragment(); 
transaction.replace(R.id.mylist, newFragment); 
transaction.addToBackStack(null); 
transaction.commit(); 

que funciona bien. Ahora sé dentro de mi actividad una cadena dinámica que necesito reemplazar en el diseño que tengo en newFragment. Pensé que puedo llamar después transaction.Commit() simplemente algo así como

newFragment.setMyString("my dynamic value"); 

Y en el newFragment.java tengo

public void setMyString(String s) 
{ 
TextView tv = (TextView) getActivity().findViewById(R.id.myobject); 
tv.setText(s); 
} 

El punto es que getActivity() devuelve un valor nulo. ¿Cómo puedo obtener el contexto que necesito para encontrar mis elementos de diseño?

Editar:

trato de seguir la ruta utilizando un paquete ya que esto parece ser la manera más limpia. Así que he cambiado mi código:

Bundle b = new Bundle(); 
b.putString("text", "my dynamic Text"); 
DetailFragment newFragment = new DetailFragment(); 
transaction.replace(R.id.mylist, newFragment); 
transaction.addToBackStack(null); 
transaction.commit(); 

Mi fragmento onCreateView se parece a esto:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
{ 
    View v = inflater.inflate(R.layout.mylayout, container, false); 
    TextView t = (TextView) v.findViewById(R.id.texttobereplaced); 
    t.setText(savedInstanceState.getString("text"); 
} 

Parece que savedInstranceState está vacía. ¿Dónde debería encontrar mi paquete?

Edit2:

perdieron los getArguments() en la respuesta. está trabajando ahora.

Respuesta

17

su Fragment no se ha unido a la Activity sin embargo, que también significa que su diseño hasn no se ha inflado aún (Consulte el Fragment lifecycle). La mejor solución sería agregar su valor String como argumento al Fragment a través del método Fragment.setArguments(Bundle). Esto se puede recuperar en la recepción Fragment a través del método Fragment.getArguments().

+1

Mi diseño está inflado en se llama aViewCreated. Puedo ver mi diseño. – AndyAndroid

2

así que también estoy usando el mismo administrador de transacciones fragmento y el único problema que puedo ver con su código es que se define la televisión TextView dentro de su método onCreateView de la clase newFragment y luego una instancia como la siguiente:

public class AboutFragment extends Fragment { 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.newFragment, container, false); 
     TextView tv = (TextView) v.findViewById(R.id.textview); 
     return v; 
    } 

    public void setMyString(String s) { 
     tv.setText(s); 
    } 
} 

sé que me cansaría realmente hacer mucho sentido, pero así es como estoy funcionando mi código y funciona bien :)

+0

lo siento no sabía que era tan importante :) lo cambió ... a la vez se ve mejor ahora – Android2390

+3

Por supuesto, la sangría de su código es importante en StackOverflow ... las personas no van a pensar que usted es una fuente muy creíble si el código es descaradamente ilegible. Acabo de editar su respuesta y eliminé el voto negativo. –

20

Asegúrese de llamar al getActivity() en o después de onAttach(), como antes devolverá null.

+0

lo siento, no entiendo dónde voy a llamar getActivity() y pasarlo a mi función setMyString(). Y si lo hago donde sugieres que aún escribas, puede o no devolver nulo. ¿Cómo voy a entender esto? – AndyAndroid

+6

El 'Fragment' se adjuntará a una actividad' null' hasta 'onActivityCreated' ... es decir, si llama a' getActivity() 'en' onCreate' o 'onCreateView', devolverá' null' porque ' Activity' aún no ha sido creado. Así que asegúrese de tener todas sus llamadas a 'getActivity()' * en o después de '' onActivityCreated'. –

+4

Esto está mal. Una vez que se llama a ontach se puede llamar a getActivity() sin que devuelva nulo. onActivityCreated es solo una devolución de llamada para cuando la actividad fue creada completamente y el diseño del fragmento ha sido instanciado. – dymmeh

0

si u necesidad de llamar getActivity en OnCreateView, mover todos ur código de onCreateView a onActivityCreate y sólo las líneas que dejan

View v = inflater.inflate(R.layout.xxxx, container, false); 
    return v; 

en onCreateView

pero tengo una situación divertida.

Mi onActivityCreated

Spinner s1 = (Spinner) getActivity().findViewById(R.id.bitlength); 
    ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
      getActivity(), R.array.bitlengths, 
      android.R.layout.simple_spinner_item); 
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    s1.setAdapter(adapter); 

En algún momento el onActivityCreated no funcionarán (correctamente !?) y por tanto la ruleta s1 quedado vacío.

Cuestiones relacionadas