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
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
).
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();
}
}
- 1. Android Fragment View State Loss Khi sử dụng FragmentTransaction.replace()
- 2. Android Fragment, quay lại mà không cần tạo lại/tải lại Fragment
- 3. Tiêm xây dựng Silverlight vào View Model + Design Mode
- 4. Giao tiếp Fragment-Fragment trong Android
- 5. Lỗi xây dựng Android
- 6. Cờ xây dựng Android?
- 7. xây dựng android-ndk?
- 8. WPF - Force ShowDialog để trả lại
- 9. làm luôn xây dựng lại
- 10. Android NDK & FFMPEG xây dựng
- 11. Truy cập Fragment View từ hoạt động của OnCreate
- 12. Xây dựng Rsync cho Android
- 13. Force TeamCity để xây dựng trên một đại lý cụ thể
- 14. Android Fragment onCreateView with Gestures
- 15. Android 1.6 & Fragment & Tabhost
- 16. Android Fragment Animation onResume
- 17. Xây dựng gia tăng NDK của Android
- 18. Xây dựng Chrome dành cho Android
- 19. xây dựng lặp lại dataframe trong R
- 20. Android: xây dựng Tệp từ android.net.URI
- 21. làm thế nào để xây dựng lại rootfs trong buildroot
- 22. Cấu hình xây dựng Android Studio
- 23. Maven xây dựng ứng dụng Android - BuildConfig
- 24. Lỗi Android Studio và Gradle xây dựng
- 25. Android: Bug trong xây dựng con đường
- 26. Xây dựng FFMPEG với x264 cho Android
- 27. Android ListView trong Fragment
- 28. Xây dựng Hồ sơ Sip: Android
- 29. Android Studio không thể xây dựng
- 30. Android: xây dựng ứng dụng GUI gốc với NDK?
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? –
@IgorGanapolsky đây sẽ là id cho vùng chứa của đoạn đó – dmSherazi