2012-02-02 16 views
8

私のアプリケーション(最小レベル13)は、アクションバーのタブを使用して2つのフラグメントを管理するアクティビティで、thisによく似ています。SetText()を呼び出すときにフラグメントレイアウト内のTextviewsが変更されない

アクティビティは、連続計算を行い、フラグメントに表示したい値を返すサービスを開始します。アクティビティ - サービス通信は放送受信機を介して実装され、アクティビティはデータを適切なフラグメントにシャッフルします。

すべてが正しく設定されているとデータがフラグメント更新メソッドになりますが、新しい値をtextviewsに表示しようとすると、新しい値は表示されません。

textviews変更するコード:アクティビティに放送受信機からのフラグメントの更新メソッドを呼び出すために

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

コードを:(私はのisVisibleことに気付きました

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

)のdoesn真実を返すようだが、それが何を意味するのか、それをどう変更するのかは分からない。

さらに、Fragmentにイメージビューをプログラムで追加することはできません。ここでは、コード(onActivityCreatedに存在する)()です:

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

BasicCompassコンストラクタは確かに私が何を私が渡していることは正しいことを完全にはわからない、コンテキストをとります。

このコードは、作業中のアクティビティから多かれ少なかれ取り込まれ、タブを許可するためにフラグメントにドロップされました。私は、コードの構造を変更することに関して提案を受けています。

ありがとうございました。

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

}

+0

さらに、私のフラグメントビューのラジオボタンをチェックすることはできません。私は、フラグメントが使用するビューに関する1つの問題があると考えています。 – Matt

答えて

6

この行は:

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

Activity.onCreate()に呼び出され、それが一度だけ呼ばれていることを確認する必要があります。あなたのコードでは、Fragmentがアクティブな状態になるたびに呼び出されます。 TextViewRaidoButtonのものは、レイアウトxmlの状態を定義するためにリセットされます。

チェックアウトフラグメントライフサイクルhere

更新: アクティビティ(たとえば、TextView)によって、一部のビューウィジェットの状態が保持されます。 setXXX()メソッドをonResume()に移動してみてください。私はsetXXX()onActivityCreated()で働いていない経験がありますが、onResume()でうまくいきます。

+0

返信いただきありがとうございます私のアプリで(アクションバーのタブを使用して)5つのフラグメントがある場合、Activity.onCreate()の各フラグメントレイアウトでsetContentView()を呼び出すだけですか?また、これは断片からビューを設定できないという問題を解決しますが、正に、これがどのように役立つかは分かりません。 – Matt

+0

私は参照してください。したがって、フラグメントは実際にはビューウィジェットを持たず、単にアクティビティのコントローラになります。 私の答えを更新しました。 – Hank

+0

私は同じ問題を抱えていて、すべての 'setXXX'コードを' onViewCreated'から 'onResume'に移動して修正しました。 Thx @ハンク!変わったことは、最初のフラグメントの追加ではすべてうまく動作しますが、フラグメントが 'popBackStack'などで再び追加されたときはうまく動作しないということです。 – tbruyelle

関連する問題