2012-02-02 39 views
8

Ứng dụng của tôi (mức tối thiểu 13) là Hoạt động sử dụng các tab trong thanh tác vụ để quản lý một vài đoạn, rất giống với this.Xem trước văn bản trong bố cục Phân đoạn không thay đổi khi gọi SetText()

Bây giờ, hoạt động bắt đầu một dịch vụ liên tục tính toán và trả về các giá trị mà tôi muốn hiển thị trong Phân đoạn. Giao tiếp Hoạt động - Dịch vụ được thực hiện thông qua bộ thu phát sóng và Hoạt động sẽ chuyển dữ liệu ra thành Phân đoạn phù hợp.

Mọi thứ có vẻ như được thiết lập chính xác và dữ liệu làm cho phương thức cập nhật Fragment nhưng khi tôi cố gắng hiển thị giá trị mới trong bản xem trước văn bản, giá trị mới sẽ không bao giờ được hiển thị.

Mã để thay đổi TextView:

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

mã để gọi Những mảnh vỡ phương pháp cập nhật từ máy thu phát sóng trong Hoạt động:

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

tôi đã nhận thấy rằng isVisible() doesn dường như không bao giờ trở lại sự thật, nhưng tôi không chắc nó có ý nghĩa gì hay cách thay đổi nó.

Ngoài ra, tôi dường như không thể thêm một lần xem hình ảnh vào Phân đoạn theo chương trình. Dưới đây là đoạn code (mà nằm trong onActivityCreated()):

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

Các constructor BasicCompass mất một bối cảnh, phải thừa nhận là tôi không hoàn toàn chắc chắn những gì tôi đang đi qua trong là đúng.

Mã cho việc này ít nhiều được lấy từ Hoạt động đang hoạt động và được thả vào Phân đoạn để cho phép các tab. Tôi đang mở để gợi ý liên quan đến việc thay đổi cấu trúc của mã.

Cảm ơn bạn đã được trợ giúp.

EDIT

Cách bố trí xml của Fragment:

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

Và Fragment sử dụng nó:

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

Hơn nữa, tôi không thể kiểm tra một số nút radio trong bất kỳ Chế độ xem phân đoạn nào của tôi. Tôi nghĩ rằng tôi có một vấn đề liên quan đến các khung nhìn mà các mảnh vỡ sử dụng. – Matt

Trả lời

6

dòng này:

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

nên được gọi là trong Activity.onCreate() và chắc chắn rằng nó chỉ được gọi một lần. Trong mã của bạn, nó sẽ được gọi mỗi khi Fragment chuyển sang trạng thái hoạt động. Và các công cụ TextViewRaidoButton sẽ được đặt lại về trạng thái xác định trong bố cục xml.

Thanh toán Vòng đời mảnh vỡ here.

CẬP NHẬT: Một số trạng thái của tiện ích chế độ xem sẽ được Giữ bởi Hoạt động, ví dụ: TextView. Hãy thử di chuyển phương thức setXXX() của bạn sang onResume().Tôi có kinh nghiệm rằng setXXX() không hoạt động ở onActivityCreated() nhưng hoạt động tốt trong onResume().

+0

Cảm ơn bạn đã trả lời, xin lỗi vì đã không trả lời trước đó. Nếu tôi có, nói rằng, năm mảnh trong ứng dụng của tôi (bằng cách sử dụng các tab thanh tác vụ) tôi sẽ chỉ gọi setContentView() trên mỗi bố cục phân đoạn trong Activity.onCreate()? Ngoài ra, điều này sẽ khắc phục được sự cố không thể đặt chế độ xem từ một đoạn, thành thật mà nói tôi không thể thực sự thấy được điều này sẽ hữu ích như thế nào. – Matt

+0

Tôi hiểu. Vì vậy, bạn mảnh thực sự không có bất kỳ widget xem nhưng chỉ cần điều khiển để hoạt động. Đã cập nhật câu trả lời của tôi. – Hank

+0

Tôi gặp vấn đề tương tự và di chuyển tất cả mã 'setXXX' từ' onViewCreated' sang 'onResume' đã sửa nó. Thx @Hank! Điều kỳ lạ là mọi thứ hoạt động tốt trên đoạn đầu tiên thêm vào, nhưng không phải khi đoạn được thêm lại thông qua 'popBackStack' chẳng hạn. – tbruyelle

Các vấn đề liên quan