2015-06-09 15 views
5

Tôi đang phát triển một ứng dụng sử dụng phân đoạn, tuần trước thiết bị thử nghiệm của tôi đã cập nhật lolipop. Khi tôi kiểm tra ứng dụng của mình trên thiết bị lolipop, tôi thấy phương thức thay thế của Giao dịch mảnh vỡ không hoạt động đúng cách.Giao dịch của Fragment thay thế trên API-21 đang ở phía sau

Tính năng này hoạt động với phiên bản Lolipop gây nhầm lẫn mặc dù mọi thứ đều tốt trên phiên bản Kitkat.

Để giải thích tình huống của tôi, tôi đã thêm một số hình ảnh.

- Màn hình đầu tiên ---------------------------- KitKat ------------- ------------------------ Lollipop -------------

enter image description here enter image description here enter image description here

Như bạn có thể thấy, khi tôi sử dụng kitkat, mọi thứ đều ổn nhưng ngay sau khi tôi sử dụng lolipop giao dịch mảnh thay thế là làm việc gây nhầm lẫn.

Đây là mã nút của tôi;

mButtonOk.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       FeedbackFragment mFragmentFeedBack = new FeedbackFragment(); 
       android.app.FragmentManager fm = getFragmentManager(); 
       fm.executePendingTransactions(); 
       android.app.FragmentTransaction fragmentTransaction = fm.beginTransaction(); 
       if (mFragmentFeedBack.isVisible()) { 
        fragmentTransaction.hide(mFragmentFeedBack); 
       } else { 

        if (!mFragmentFeedBack.isAdded()) { 
         fragmentTransaction.replace(R.id.containerfragment, mFragmentFeedBack); 
        } 


        fragmentTransaction.show(mFragmentFeedBack); 
       } 
       fragmentTransaction.addToBackStack(null); 
       fragmentTransaction.commit(); 

      } 
     }); 

đây là xml của tôi;

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" 
android:layout_height="match_parent" tools:context=".MainActivity"> 


<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="New Button" 
    android:id="@+id/button" 
    android:layout_alignParentTop="true" 
    android:layout_centerHorizontal="true" 
    android:layout_marginTop="117dp" /> 

<FrameLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:id="@+id/containerfragment"> 

</FrameLayout> 

EDIT: phiên bản Kitkat đang chạy trên một máy tính bảng, nhưng tôi đã cố gắng ứng dụng của tôi trên điện thoại (phiên bản Kitkat) kết quả là như nhau. Không thay đổi.

Cảm ơn.

+0

bạn có kiểm tra trong máy tính bảng (có kẹo) cùng một ứng dụng không ?? –

+0

Có. nó hoạt động tương tự. Khi thử nghiệm thiết bị phiên bản lollipop, thay thế phân đoạn ở lại phía sau. – salih

+0

Bạn đã nói "Tôi thấy phương thức thay thế của Giao dịch mảnh vỡ không hoạt động đúng". Nhưng có vẻ như tôi fragmentTransaction.hide được thực hiện thay vì thay thế(), do mã if (mFragmentFeedBack.isVisible()). Bạn có nghĩ rằng đó là có thể? Trong trường hợp này, hãy kiểm tra KitKat ít nhất. –

Trả lời

0

Các vấn đề có thể có thể là mã:

if (mFragmentFeedBack.isVisible()) 

tôi không khuyên bạn sử dụng phương pháp này để kiểm tra tầm nhìn. Theo tài liệu @Fragment isVisible(), nó nói

... Điều này có nghĩa nó: (1) đã được thêm vào, (2) có quan điểm của mình gắn liền với cửa sổ, và (3) không bị ẩn.

Phần này của câu không rõ ràng. Tôi nghi ngờ KitKat nói rằng nó là không thể nhìn thấy nhưng Lollipop nói nó là, và tôi đồng ý với việc thực hiện Lollipop. KitKat nói rằng Fragment được thêm vào (có), khung nhìn được đính kèm (có), ẩn (không thực sự!). Đây thực sự là một vấn đề GUI với các thư viện GUI khác, tin hay không!

giải pháp có thể, cho bây giờ:

  1. Tạo một lá cờ boolean, và duy trì lá cờ giữa 2 mảnh. Nếu điều này là đơn giản để làm, điều này là tốt nhất.
  2. Kiểm tra xem nút hoặc chế độ xem có thể nhấp hay không, không biết cái nào. Điều này chắc chắn hơn việc kiểm tra isVisible().
  3. Tôi nghĩ rằng thiết kế mã hơi phức tạp hơn một chút. Bây giờ, đây là gợi ý của tôi. Khi người dùng nhấn nút "New", chỉ cần gọi phương thức replace(), không sử dụng các phương thức ẩn/hiện. Khi người dùng nhấn nút GỬI trong đoạn phản hồi, hãy gọi phương thức popBackStack() hoặc replace().Làm thế nào về điều đó?
+0

Giải pháp của bạn dường như tốt cho tôi nhưng tôi không thể kiểm tra xem nút có thể nhấp hay không nhấp được. Bởi vì, nút bấm giờ làm thêm được. Vì vậy, tôi không thể thực hiện các giải pháp này trên dự án của mình. :( – salih

+0

Làm thế nào về giải pháp có thể # 1? –

+0

Tôi đã thêm một giải pháp có thể vào # 3. Nếu bạn đồng ý, bạn có thể tìm mã mẫu cho nó không? –

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