在调用SetText()时,Fragment布局中的Textviews不会改变

我的应用程序(最低等级13)是一个使用操作栏中的选项卡来pipe理几个片段的活动,与此非常相似。

现在,该活动启动一个服务,进行连续计算并返回值,我想在碎片中显示。 活动 – 服务通信是通过广播接收器实现的,活动将数据混洗到相应的片段。

一切似乎设置正确,数据使它的碎片更新方法,但是当我尝试显示文本中的新值,新的值永远不会显示。

更改文字视图的代码:

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

在Activity中从广播接收者调用Fragments更新方法的代码:

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

我注意到isVisible()似乎永远不会返回true,但我不确定它是什么意思或如何改变它。

此外,我似乎无法以编程方式添加一个ImageView的片段。 这是代码(驻留在onActivityCreated()):

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

BasicCompass的构造函数需要一个Context,但我不完全确定我传递的是正确的。

这个代码或多或less取自一个工作活动,并放入一个片段以允许制表符。 关于改变代码的结构,我愿意提出build议。

谢谢你的帮助。

编辑

片段的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; } 

}

Solutions Collecting From Web of "在调用SetText()时,Fragment布局中的Textviews不会改变"

这一行:

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

应该在Activity.onCreate()调用,并确保它只被调用一次。 在您的代码中,每当Fragment进入活动状态时都会调用它。 而TextViewRaidoButton东西将被重置为布局xml中的状态定义。

结帐片段生命周期在这里 。

更新:一些视图小部件的状态将保持活动,例如TextView。 尝试将你的setXXX()方法移动到onResume() 。 我有经验, setXXX()onActivityCreated()不工作,但在onResume()很好地工作。