2013-03-10 17 views
14

Tôi đang cố gắng sử dụng các đoạn để xây dựng Ứng dụng Android phù hợp đầu tiên của mình. Tôi có một xml chính. bao gồm hai đoạn thẳng đứng, các đoạn trên cùng chỉ bao gồm hai TextView. Việc đầu tiên trong số này chứa văn bản tĩnh và thứ hai chứa một giá trị mà cuối cùng tôi sẽ nhận được động từ SQL.Android: Làm thế nào để cập nhật textView của tôi trong một Fragment

Nếu tôi đặt này là MainActivity.java tôi thì hạnh phúc sẽ cập nhật giá trị của TextView trong Fragment đầu tiên của tôi:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.activity_main); 

    // Set the Text to try this out 
    TextView t = (TextView)findViewById(R.id.viewItem); 
    t.setText("Text to Display"); 
} 

Tôi có hai XMLs mảnh và một java để hỗ trợ lẫn vì vậy tôi muốn đặt cài đặt của trường này vào Java hỗ trợ phân đoạn thay vì java dành cho MainActivity.

Khi tôi đặt nó trong đoạn nó trông như thế này: -

public class FragmentMainTop extends Fragment { 
@Override 
public View onCreateView(LayoutInflater inflater, 
     ViewGroup container, Bundle savedInstanceState){ 
    // -- inflate the layout for this fragment 
    return inflater.inflate(R.layout.fragmentmt, container,false); 

    // Set the Text to try this out 
    TextView t = (TextView)findViewById(R.id.viewItem); 
    t.setText("Text to Display"); 
} 

Nhưng nếu tôi làm điều này tôi nhận được một lỗi trên dòng TextView:

"Phương pháp findViewById (int) là không xác định cho loại FragmentMainTop "

Vậy tại sao nó không biết phương pháp này? Tôi có ctl/shift/o vì vậy tôi biết tôi có tất cả các quyền nhập khẩu. Tôi không muốn kết thúc việc đưa tất cả mã của mình vào MainActivity bởi vì nếu tôi muốn sử dụng Fragment trong một hoạt động khác, tôi sẽ phải lặp lại tất cả mã.

Trả lời

45

Bạn cần gán bố cục phân đoạn tăng lên cho biến để bạn có thể truy cập phương thức findViewById() của nó. Sau đó, bạn trả lại khi bạn đã cập nhật xong các tiện ích của mình.

@Override 
public View onCreateView(LayoutInflater inflater, 
     ViewGroup container, Bundle savedInstanceState){ 
    // -- inflate the layout for this fragment 
    View myInflatedView = inflater.inflate(R.layout.fragmentmt, container,false); 

    // Set the Text to try this out 
    TextView t = (TextView) myInflatedView.findViewById(R.id.viewItem); 
    t.setText("Text to Display"); 

    return myInflatedView; 
} 

Thông thường, khi bạn gọi findViewById() trong một Activity, bạn đang gọi Activity.findViewById(). Việc thử cùng một cuộc gọi trong lớp Fragment của bạn sẽ không thành công do không có phương thức Fragment.findViewById() như vậy. Vì vậy, bạn phải sử dụng View.findViewById() với chế độ xem được tăng cao để có được tham chiếu đến tiện ích của bạn.

+0

Tài liệu tham khảo được trả về thành công ngay cả khi tôi tìm findViewByID trên Hoạt động được trả về bởi fragment.getActivity(). Nhưng việc cập nhật lượt xem vẫn không hoạt động –

2

Tôi không phải là một chuyên gia nhưng tôi có thể nói rằng tuyên bố trở lại trong vòng một phương thức trả về một cái gì đó và các đường tiếp theo sau khi tuyên bố này là unreachable: O

Vì vậy, cố gắng để thay đổi thứ tự! :)

0

Tôi đang sử dụng mã này từ hoạt động của mình để cập nhật chế độ xem văn bản được thêm vào thẻ xml. Textview là các đối tượng cấp lớp. Heres một số mã:

<fragment 
    android:id="@+id/fragmentRegister" 
    android:name="com.proshore.loveis.RegisterFragment" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_alignParentLeft="true" 
    android:layout_below="@+id/view1" /> 

Cô ấy mã phân đoạn chỉ hiển thị biến cấp lớp.

public class RegisterFragment extends Fragment implements OnClickListener { 

TextView textViewDOB, textViewLanguage; 

public RegisterFragment() { 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
//eluded methods here 
} 
} 

Bây giờ hoạt động từ nơi tôi cập nhật đoạn của tôi:

public class RegisterActivity extends FragmentActivity { 
Button buttonEnter; 
RegisterFragment fragmentRegister; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_register); 
    buttonEnter = (Button) findViewById(R.id.buttonEnter); 
    fragmentRegister = (RegisterFragment) getSupportFragmentManager() 
      .findFragmentById(R.id.fragmentRegister); 
} 

@Override 
protected void onStart() { 
    // TODO Auto-generated method stub 
    super.onStart(); 
    buttonEnter.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      Log.d("dontknowitwillowrk", fragmentRegister.textViewLanguage 
        .getText().toString()); 
      fragmentRegister.textViewLanguage.setText("hello mister how do you do"); 


     } 
    }); 
} 
} 

Lưu ý: không chắc chắn nếu điều này là một cách tốt.