2012-02-02 55 views
8

时,片段布局中的文本视图不会更改我的应用程序(最低等级13)是一个活动,它使用操作栏中的选项卡来管理几个片段,非常类似于this当调用SetText()

现在,活动启动一个服务,它执行连续计算并返回值,我希望在碎片中显示。活动 - 服务通信通过广播接收器实现,活动将数据混洗到适当的片段。

似乎所有东西都安装正确,并且数据使其成为碎片更新方法,但是当我尝试在文本视图中显示新值时,新值从不显示。

改变textviews代码:

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()没有按似乎永远不会回复真实,但我不确定它是什么意思或如何改变它。

此外,我似乎无法以编程方式将图像视图添加到片段。这里是(驻留在onActivityCreated())代码:

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

的BasicCompass构造函数有一个背景下,诚然我不能完全肯定就是我传递是正确的。

其中的代码或多或少取自工作活动并放入碎片以允许制表符。对于改变代码结构,我愿意提供建议。

感谢您的任何帮助。

编辑

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

此外,我无法检查我的任何碎片视图中的一些单选按钮。我在想,我有一个与碎片使用的视图有关的问题。 – Matt 2012-02-03 00:51:53

回答

6

这一行:

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

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

结帐片段生命周期here

更新: 某些视图控件的状态将由Activity保留,例如TextView。尝试将您的setXXX()方法移至onResume()。我有经验setXXX()不在onActivityCreated()工作,但在onResume()工作良好。

+0

感谢您的回复,抱歉没有回复。如果我有我的应用程序中的五个片段(使用操作栏选项卡),我只需在Activity.onCreate()中的每个片段布局上调用setContentView()?此外,这将解决无法从片段设置视图的问题,说实话,我真的不明白这将如何帮助。 – Matt 2012-03-09 18:36:38

+0

我明白了。所以你的片段实际上没有任何视图小部件,但只是控制器到活动。 有更新我的答案。 – Hank 2012-03-13 13:09:32

+0

我有同样的问题,并将所有'setXXX'代码从'onViewCreated'移动到'onResume'固定它。 Thx @Hank!奇怪的是,在第一次片段添加时,一切都很好,但是当片段再次通过“popBackStack”添加时,不会发生。 – tbruyelle 2013-05-20 13:27:34

相关问题