2012-02-02 6 views
8

Mi aplicación (nivel mínimo 13) es una actividad que utiliza pestañas en la barra de acciones para administrar un par de fragmentos, muy similar a this.Textviews en un diseño de Fragmento no cambian al llamar a SetText()

Ahora, la actividad inicia un servicio que realiza cálculos continuos y devuelve valores que me gustaría mostrar en los Fragmentos. La actividad - La comunicación del servicio se implementa a través de receptores de difusión y la actividad mezcla los datos en el Fragmento apropiado.

Todo parece estar configurado correctamente y los datos llegan al método de actualización del Fragmento, pero cuando trato de mostrar los nuevos valores en textviews, los nuevos valores nunca se muestran.

El código para cambiar las textviews:

TextView tv = (TextView) getView().findViewById(R.id.fieldNavGpsTime); 
    Double doub = input.getDoubleExtra("com.some.thing.GPS_TIME", -1.0); 
    tv.setText(doub.toString()); 

El código para llamar a los métodos de actualización fragmentos del receptor de radiodifusión en la Actividad:

NavigationGuiFragment navfrag = (NavigationGuiFragment) getFragmentManager().findFragmentByTag("navigation"); 
    if (navfrag != null && navfrag.isResumed()) 
     navfrag.UpdateNavUI(intent); 

me he dado cuenta de que isVisible() doesn Parece que nunca es cierto, pero no estoy seguro de lo que significa o cómo cambiarlo.

Además, parece que no puedo agregar una vista de imagen a un fragmento mediante programación. Aquí está el código (que reside en onActivityCreated()):

this.compass = new BasicCompass(getActivity()); 
    LinearLayout ll = (LinearLayout) getView().findViewById(R.id.nav_hrztl_lnly); 
    ll.addView(this.compass); 

El constructor BasicCompass tiene un contexto, la verdad es que no estoy completamente seguro de lo que estoy pasando es correcta.

El código para esto se tomó más o menos de una Actividad de trabajo y se colocó en un Fragmento para permitir las pestañas. Estoy abierto a la sugerencia con respecto a cambiar la estructura del código.

Gracias por cualquier ayuda.

EDITAR

El diseño xml del fragmento:

<?xml version="1.0" encoding="UTF-8"?> 
<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/nav_hrztl_lnly" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:orientation="horizontal" 
android:focusable="true" 
android:focusableInTouchMode="true" 
android:baselineAligned="false" > 

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="600dp" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" 
    android:focusable="true" 
    android:focusableInTouchMode="true" > 

    <EditText 
     android:id="@+id/labelNavGpsTime" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="@string/gps_time" /> 

    <EditText 
     android:id="@+id/fieldNavGpsTime" 
     style="@style/field_padding" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:hint="@string/zero_3_digits" 
     android:inputType="numberDecimal" /> 

    <EditText 
     android:id="@+id/labelNavLatitude" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="@string/latitude" /> 

    <EditText 
     android:id="@+id/fieldNavLatitude" 
     style="@style/field_padding" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:hint="@string/zero_6_digits" 
     android:inputType="numberDecimal" /> 

    <EditText 
     android:id="@+id/labelNavLongitude" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="@string/longitude" /> 

    <EditText 
     android:id="@+id/fieldNavLongitude" 
     style="@style/field_padding" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:hint="@string/zero_6_digits" 
     android:inputType="numberDecimal" /> 

    <EditText 
     android:id="@+id/labelNavAltitude" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="@string/altitude" /> 

    <EditText 
     android:id="@+id/fieldNavAltitude" 
     style="@style/field_padding" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:hint="@string/zero_3_digits" 
     android:inputType="numberDecimal" /> 

    <EditText 
     android:id="@+id/labelNavRoll" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="@string/roll" /> 

    <EditText 
     android:id="@+id/fieldNavRoll" 
     style="@style/field_padding" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:hint="@string/zero_6_digits" 
     android:inputType="numberDecimal" /> 

    <EditText 
     android:id="@+id/labelNavPitch" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="@string/pitch" /> 

    <EditText 
     android:id="@+id/fieldNavPitch" 
     style="@style/field_padding" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:hint="@string/zero_6_digits" 
     android:inputType="numberDecimal" /> 

    <EditText 
     android:id="@+id/labelNavAzimuth" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="@string/azimuth_heading" /> 

    <EditText 
     android:id="@+id/fieldNavAzimuth" 
     style="@style/field_padding" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:hint="@string/zero_6_digits" 
     android:inputType="numberDecimal" /> 

    <LinearLayout 
     android:id="@+id/nav_rdbtn_lnly" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" > 

     <RadioButton 
      android:id="@+id/rdbtnNavGpsAvailability" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="@string/gps_avail" /> 

     <RadioButton 
      android:id="@+id/rdbtnNavZuptStatus" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="@string/zupt_stat" /> 

    </LinearLayout> 

</LinearLayout> 

y el fragmento que lo utiliza:

public class NavigationGuiFragment extends Fragment 
{ 
private RadioButton gpsRdBtn; 
private RadioButton zuptRdBtn; 
private BasicCompass compass; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
{ 
    View fragview = inflater.inflate(R.layout.navigation_fragment, container, false); 

    // sets up the rose image that serves as a compass in the GUI 
    this.compass = new BasicCompass(getActivity()); 
    LinearLayout ll = (LinearLayout) fragview.findViewById(R.id.nav_hrztl_lnly); 
    ll.addView(this.compass); 

    return fragview; 
} 

@Override 
public void onActivityCreated(Bundle savedInstanceState) 
{ 
    super.onActivityCreated(savedInstanceState); 
    getActivity().setContentView(R.layout.navigation_fragment); 

    //Initialize the radio buttons 
    gpsRdBtn = (RadioButton) getView().findViewById(R.id.rdbtnNavGpsAvailability); 
    gpsRdBtn.setChecked(false); 

    zuptRdBtn = (RadioButton) getView().findViewById(R.id.rdbtnNavZuptStatus); 
    zuptRdBtn.setChecked(false);  
} 

@Override 
public void onResume() 
{ 
    super.onResume(); 

    if (!IsMyServiceRunning()) 
    { 
     gpsRdBtn.setChecked(false); 
     zuptRdBtn.setChecked(false); 
    } 
} 

public void UpdateNavUI(Intent input) 
{  
    TextView tv = (TextView) getView().findViewById(R.id.fieldNavGpsTime); 
    Double doub = input.getDoubleExtra("com.some.thing.GPS_TIME", -1.0); 
    tv.setText(doub.toString()); 

    tv = (TextView) getView().findViewById(R.id.fieldNavLatitude); 
    doub = input.getDoubleExtra("com.some.thing.LATITUDE", 100000.0); 
    tv.setText(doub.toString()); 

    tv = (TextView) getView().findViewById(R.id.fieldNavLongitude); 
    doub = input.getDoubleExtra("com.some.thing.LONGITUDE", 100000.0); 
    tv.setText(doub.toString()); 

    tv = (TextView) getView().findViewById(R.id.fieldNavAltitude); 
    doub = input.getDoubleExtra("com.some.thing.ALTITUDE", -1.0); 
    tv.setText(doub.toString()); 

    tv = (TextView) getView().findViewById(R.id.fieldNavRoll); 
    doub = input.getDoubleExtra("com.some.androidndk.ROLL", 361.0); 
    tv.setText(doub.toString()); 

    tv = (TextView) getView().findViewById(R.id.fieldNavPitch); 
    doub = input.getDoubleExtra("com.some.thing.PITCH", 361.0); 
    tv.setText(doub.toString()); 

    tv = (TextView) getView().findViewById(R.id.fieldNavAzimuth); 
    doub = input.getDoubleExtra("com.some.thing.AZIMUTH", 361.0); 
    tv.setText(doub.toString()); 

    this.compass.SetDirection(doub.floatValue()); 

    boolean bool = input.getBooleanExtra("com.some.thing.ZUPT_STATUS", false); 
    zuptRdBtn.setChecked(bool); 

    UpdateGpsIndicator(input); 
} 

public void UpdateGpsIndicator(Intent input) 
{ 
    boolean bool = input.getBooleanExtra("com.some.thing.GPS_ON", false); 
    gpsRdBtn.setChecked(bool); 
} 

private boolean IsMyServiceRunning() 
{ 
    ActivityManager manager = (ActivityManager) getActivity().getSystemService(Context.ACTIVITY_SERVICE); 
    for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) 
    { 
     if ("com.some.thing.Service".equals(service.service.getClassName())) 
      return true; 
    } 

    return false; 
} 

}

+0

Además, no puedo verificar algunos botones de opción en ninguna de las Vistas de Fragmentos. Estoy pensando que tengo un problema relacionado con las Vistas que usan los Fragmentos. – Matt

Respuesta

6

esta línea:

getActivity().setContentView(R.layout.navigation_fragment); 

debería llamarse en Activity.onCreate() y asegúrese de que sólo se llama una vez. En su código se invocará cada vez que Fragment se mueva al estado activo. Y las cosas TextView y RaidoButton se restablecerán a la definición de estado en el diseño xml.

Checkout Fragment lifecycle here.

ACTUALIZACIÓN: Algunos elementos del estado de la vista se mantendrán en la actividad, por ejemplo, TextView. Intente mover su método setXXX() al onResume().Tengo experiencia en que setXXX() no funciona en onActivityCreated() pero funciona bien en onResume().

+0

Gracias por la respuesta, lo siento por no haber respondido antes. Si tengo, por ejemplo, cinco fragmentos en mi aplicación (usando las pestañas de la barra de acciones), ¿me limitaría a llamar a setContentView() en cada diseño de fragmento en Activity.onCreate()? Además, esto solucionará el problema de no poder establecer vistas desde un fragmento, para ser honesto, realmente no puedo ver cómo esto podría ayudar. – Matt

+0

Ya veo. Entonces, en realidad, el fragmento no tiene ningún widget de vista, sino solo el controlador de Actividad. Tengo la actualización de mi respuesta. – Hank

+0

Tuve el mismo problema y se corrigió todo el código 'setXXX' de' onViewCreated' a 'onResume'. ¡Thx @Hank! Lo extraño es que todo funciona bien en el primer fragmento de agregar, pero no cuando el fragmento se agrega de nuevo a través de 'popBackStack', por ejemplo. – tbruyelle

Cuestiones relacionadas