2011-10-17 22 views
14

Tôi có một ứng dụng đơn giản có hai đoạn và khi ở chế độ ngang, cả hai mảnh được hiển thị cạnh nhau và trong ảnh chân dung tôi hiển thị Fragment A và sau đó nếu họ chọn một tùy chọn, hãy bắt đầu Hoạt động Hiển thị Fragment B. Vấn đề của tôi là khi tôi đang ở chế độ Portrait và hiển thị Fragment B, nếu người dùng chọn một tùy chọn menu tôi muốn refresh hoặc vẽ lại View được liên kết với Fragment B và không thể hiểu cách thực hiện công việc này. Tôi đã thử phương thức getView và phương thức getLayoutInflater nhưng màn hình không thay đổi vì tôi nghĩ rằng tôi đang tạo chế độ xem mới. Tôi cũng đã cố gắng để có được một tham chiếu đến Fragment A nghĩ rằng tôi có thể gọi thường trình của nó để xây dựng một mảnh mới và thay thế Fragment B nhưng không thể có được một tham chiếu đến nó bởi vì nó không được hiển thị. Điều tôi thực sự cần làm là buộc phương thức onCreateView được gọi lại để tăng lượt xem mới nhưng tôi đã thử một số phương pháp để cố gắng thực hiện điều này nhưng không thể gọi lại onCreateView. Bất kỳ suy nghĩ về cách này?Android force Fragment để xây dựng lại View

Trả lời

1

nếu người sử dụng chọn một tùy chọn menu Tôi muốn làm mới hoặc vẽ lại Xem được liên kết với Fragment B và không thể hiểu làm thế nào để làm cho công việc này

Trong onOptionsItemSelected(), có cuộc gọi hoạt động một phương pháp trên phân đoạn làm cho nó cập nhật các widget của nó với nội dung mới. Hoặc, có hoạt động thực hiện một FragmentTransaction để thay thế đoạn (nếu đoạn ban đầu được thiết lập thông qua FragmentTransaction).

9

Bạn sẽ muốn thực hiện một FragmentTransaction và sử dụng các phương pháp replace()

này không phải là quá khó để làm, nhưng câu trả lời sẽ phụ thuộc vào nơi Menu nằm (tức là onOptionsItemSelected() cuộc gọi của bạn trở lại bên trong của bạn hoạt động gốc hoặc là nó trong Phân đoạn A/B?).

Giả sử vì mục đích đơn giản, triển khai menu của bạn và onOptionsItemSelected() nằm trong hoạt động gốc và bạn muốn định hình lại các đoạn trong trường hợp menu_option1 được chọn. Nó sẽ trông giống như thế này:

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
// Handle item selection 
//... 
switch (item.getItemId()) { 
case R.id.menu_option1: 
    //do something 
    FragmentManager fragmentManager = getFragmentManager(); 
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
    Fragment newFragment = new YourFragmentClass(); 
    FragmentTransaction transaction = getFragmentManager().beginTransaction(); 
    transaction.replace(R.id.your_fragment_id, newFragment); 
    transaction.addToBackStack(null); 
    transaction.commit(); 
    return true; 
case R.id.menu_option2: 
    //do something else; 
    return true; 
default: 
    return super.onOptionsItemSelected(item); 
} 
} 

Hoặc, nếu thực đơn của bạn là con của một trong các mảnh vỡ của bạn, thì một phương pháp là yêu cầu hoạt động của máy chủ để thực hiện một giao diện được xác định bởi Fragment, có thể được sử dụng như một cuộc gọi trở lại. Và trong cuộc gọi lại onOptionsItemSelected() bên trong lớp phân đoạn của bạn, bạn chỉ cần thực hiện cuộc gọi đến phương thức gọi lại này.

Mặc dù nó nghe có vẻ giống như một ngụm, bạn chỉ thực sự cần phải làm một vài điều. Giả vờ rằng đây là bạn lớp Fragment

public static class FragmentA extends ListFragment { 
OnSelectedListener mListener; 
// Container Activity must implement this interface 
public interface OnSelectedListener { 
    public void onSelected(); 
} 
... 
@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 
    //This is to ensure that the Activity has implemented the interface we set up above 
    try { 
     mListener = (OnSelectedListener) activity; 
    } catch (ClassCastException e) { 
     throw new ClassCastException(activity.toString() + " must implement OnSelectedListener"); 
    } 
} 
@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
// Handle item selection 
//... 
switch (item.getItemId()) { 
case R.id.menu_option1: 
    //do something 
    getActivity().onSelected(); 
    return true; 
case R.id.menu_option2: 
    //do something else; 
    return true; 
default: 
    return super.onOptionsItemSelected(item); 
} 
} 
... 
} 

Sau đó, trong hoạt động, bạn sẽ thấy một cái gì đó như:

public class MainActivity extends Activity implements FragmentA.onSelectedListener{ 
... 
public void onSelected(){ 
    FragmentManager fragmentManager = getFragmentManager(); 
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
    Fragment newFragment = new YourFragmentClass(); 
    FragmentTransaction transaction = getFragmentManager().beginTransaction(); 
    transaction.replace(R.id.your_fragment_id, newFragment); 
    transaction.addToBackStack(null); 
    transaction.commit(); 
} 
} 
+7

Khi bạn đang thay thế R.id.your_fragment_id, bạn đang giả định rằng nó đã được khai báo trong XML . Nhưng nếu mảnh gốc của tôi được xây dựng theo chương trình thì sao? –

+1

@IgorGanapolsky đây sẽ là id cho vùng chứa của đoạn đó – dmSherazi