Cách chống lừa đảo để xử lý Fragment khi thay đổi hướng


87
public class MainActivity extends Activity implements MainMenuFragment.OnMainMenuItemSelectedListener {

 @Override
 public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    FragmentManager fragmentManager = getFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager
            .beginTransaction();

    // add menu fragment
    MainMenuFragment myFragment = new MainMenuFragment();
    fragmentTransaction.add(R.id.menu_fragment, myFragment);

    //add content
    DetailPart1 content1= new DetailPart1 ();
    fragmentTransaction.add(R.id.content_fragment, content1);
    fragmentTransaction.commit();

}
public void onMainMenuSelected(String tag) {
  //next menu is selected replace existing fragment
}

Tôi có nhu cầu hiển thị hai chế độ xem danh sách cạnh nhau, menu bên trái và nội dung của nó ở bên phải. Theo mặc định, menu đầu tiên được chọn và nội dung của nó được hiển thị ở phía bên phải. Fragment hiển thị nội dung như sau:

public class DetailPart1 extends Fragment {
  ArrayList<HashMap<String, String>> myList = new ArrayList<HashMap<String, String>>();
  ListAdapter adap;
  ListView listview;

  @Override
  public void onActivityCreated(Bundle savedInstanceState) {
      super.onActivityCreated(savedInstanceState);

       if(savedInstanceState!=null){
        myList = (ArrayList)savedInstanceState.getSerializable("MYLIST_obj");
        adap = new LoadImageFromArrayListAdapter(getActivity(),myList );
        listview.setAdapter(adap);
       }else{
        //get list and load in list view
        getlistTask = new GetALLListTasks().execute();
    }


     @Override
   public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.skyview_fragment, container,false);
           return v;
        }


     @Override
      public void onSaveInstanceState(Bundle outState) {
         super.onSaveInstanceState(outState);
          outState.putSerializable("MYLIST_obj", myList );
        }
    }

OnActivityCreate và onCreateView được gọi hai lần . Có rất nhiều ví dụ sử dụng mảnh vỡ. Vì tôi là người mới bắt đầu trong chủ đề này, tôi không thể liên hệ ví dụ với vấn đề của tôi. Tôi cần một cách chứng minh ngu ngốc để xử lý sự thay đổi định hướng. Tôi đã KHÔNG khai báo android:configChangestrong tệp kê khai. Tôi cần hủy hoạt động và tạo lại để có thể sử dụng bố cục khác nhau ở chế độ ngang.


Thông thường, các thay đổi định hướng phân mảnh được thực hiện mà bạn không cần làm gì cả. Vậy vấn đề bạn gặp phải khi thay đổi định hướng là gì?
Alexander Kulyakhtin

Alex Tôi cần phân đoạn DetailPart1 của lớp để hiển thị bố cục với listView ở chế độ dọc và bố cục với Grid View ở chế độ ngang. Vì điều này, tôi cần tạo lại phân đoạn này mọi lúc nhưng tôi không muốn tải lại các bản ghi giống nhau, vì vậy tôi lưu trữ chúng ở onSaveInstanceState .Nhưng các mã trên tái DetailPart1 hai lần, tôi cần phải biết mã mất tích mà làm cho nó hoạt động như mong muốn
user1811741

Câu trả lời:


132

Bạn đang tạo một phân đoạn mới mỗi khi xoay màn hình trong hoạt động của mình onCreate();Nhưng bạn cũng đang duy trì những phân đoạn cũ với super.onCreate(savedInstanceState);. Vì vậy, có thể đặt thẻ và tìm phân đoạn nếu nó tồn tại hoặc chuyển gói null cho siêu.

Điều này đã khiến tôi mất một thời gian để tìm hiểu và nó thực sự có thể là một bi **** khi bạn đang làm việc với những thứ như viewpager.

Tôi khuyên bạn nên đọc thêm về các mảnh vỡ vì chủ đề chính xác này đã được đề cập.

Dưới đây là một ví dụ về cách xử lý các đoạn khi thay đổi hướng thường xuyên:

Hoạt động :

public class MainActivity extends FragmentActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if (savedInstanceState == null) {
            TestFragment test = new TestFragment();
            test.setArguments(getIntent().getExtras());
            getSupportFragmentManager().beginTransaction().replace(android.R.id.content, test, "your_fragment_tag").commit();
        } else {
            TestFragment test = (TestFragment) getSupportFragmentManager().findFragmentByTag("your_fragment_tag");
        }
    }
}

Phân mảnh :

public class TestFragment extends Fragment {

    public static final String KEY_ITEM = "unique_key";
    public static final String KEY_INDEX = "index_key";
    private String mTime;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_layout, container, false);

        if (savedInstanceState != null) {
            // Restore last state
            mTime = savedInstanceState.getString("time_key");
        } else {
            mTime = "" + Calendar.getInstance().getTimeInMillis();
        }

        TextView title = (TextView) view.findViewById(R.id.fragment_test);
        title.setText(mTime);

        return view;
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putString("time_key", mTime);
    }
}

cảm ơn Warpzit vì nỗ lực của bạn, nhưng tôi sẽ rất vui nếu bạn giải thích bằng mã về quan điểm của mình.Cách thay đổi mã của tôi để xử lý thay đổi hướng mà không cần tải lại phân đoạn.
user1811741

1
Do đó, tôi cần bố trí của phân đoạn được thay đổi theo hướng, nhưng tôi không muốn tải lại tất cả các bản ghi, những gì tôi đã làm là 1. thêm android: configchanges = "định hướng" trong tệp kê khai 2. ghi đè onConfigurationChanged trong phân đoạn và phát hiện hướng và ẩn / hiện chế độ xem danh sách hoặc chế độ xem lưới tùy thuộc vào hướng. Đây là cách đúng?
user1811741

@ user1811741 được cập nhật với ví dụ. Tôi hy vọng nó làm sáng tỏ mọi thứ.
Warpzit

@Warpzit.
CoDe

1
@Shubh tôi tin rằng viewpager xử lý điều này đúng cách, nếu không, bạn sẽ phải ghi đè triển khai getItem để phù hợp với nhu cầu của mình. Hy vọng rằng sẽ chỉ bạn đi đúng hướng, nếu không đưa ra một câu hỏi thích hợp :)
Warpzit

21

Bạn có thể tìm thấy hướng dẫn tốt về cách lưu giữ dữ liệu giữa các thay đổi định hướng và tạo hoạt động trong hướng dẫn android .

Tóm lược:

  1. làm cho phân đoạn của bạn có thể truy xuất được:

    setRetainInstance(true);
    
  2. Chỉ tạo một phân đoạn mới nếu cần thiết (hoặc ít nhất là lấy dữ liệu từ nó)

    dataFragment = (DataFragment) fm.findFragmentByTag("data");
    
    // create the fragment and data the first time
    if (dataFragment == null) {
    

tốt đẹp Tiết kiệm thời gian của tôi wah
Arjun saini
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.