Текстовые представления в макете фрагмента не изменяются при вызове SetText () - PullRequest
8 голосов
/ 03 февраля 2012

Мое приложение (минимальный уровень 13) - это действие, которое использует вкладки на панели действий для управления парой фрагментов, очень похоже на this .

Теперь действие запускает службу, которая выполняет непрерывные вычисления и возвращает значения, которые я хотел бы отобразить во фрагментах. Действие - связь между Сервисом осуществляется через широковещательные приемники, и Действие перенаправляет данные в соответствующий фрагмент.

Кажется, все настроено правильно, и данные попадают в метод обновления фрагмента, но когда я пытаюсь отобразить новые значения в текстовых представлениях, новые значения никогда не отображаются.

Код для изменения вида текста:

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

Код для вызова методов обновления фрагментов из широковещательного получателя в действии:

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

Я заметил, что isVisible (), похоже, никогда не возвращает true, но я не уверен, что это значит или как его изменить.

Кроме того, я не могу добавить видение изображения во фрагмент программно. Вот код (который находится в onActivityCreated ()):

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

Конструктор BasicCompass принимает Context, правда, я не совсем уверен, что то, что я передаю, правильно.

Код для этого был более или менее взят из рабочего занятия и помещен во фрагмент для учета вкладок. Я открыт для предложений относительно изменения структуры кода.

Спасибо за любую помощь.

EDIT

XML-макет фрагмента:

<?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>

И фрагмент, который его использует:

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;
}

}

1 Ответ

6 голосов
/ 24 февраля 2012

эта строка:

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

должна быть вызвана в Activity.onCreate() и убедитесь, что она вызывается только один раз.В вашем коде он будет вызываться каждый раз, когда фрагмент переходит в активное состояние.И элементы TextView и RaidoButton будут сброшены в состояние, определенное в макете xml.

Жизненный цикл фрагмента извлечения здесь .

ОБНОВЛЕНИЕ: Состояние некоторых виджетов будет сохраняться в Activity, например, TextView.Попробуйте переместить ваш метод setXXX() на onResume().У меня есть опыт, что setXXX() не работает в onActivityCreated(), но хорошо работает в onResume().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...