2011-03-14 32 views
44

Ok, bất cứ khi nào tôi cố gắng thay thế một đoạn trong ứng dụng của mình, nó chỉ thêm mảnh bên trong của vùng chứa mà đoạn còn lại và rời khỏi đoạn hiện tại. Tôi đã thử gọi thay thế và tham chiếu chế độ xem có chứa phân đoạn và bằng cách tham chiếu chính đoạn đó. Cả hai đều không hoạt động. Tôi có thể thêm một đoạn vào một khung nhìn với trình quản lý giao tác phân đoạn, nhưng ngay cả khi tôi cố gắng loại bỏ nó sau khi nó được thêm vào, nó không hoạt động. Bất kỳ trợ giúp sẽ được đánh giá cao. Đây là các tập tin của tôi.Sao chép mảnh vỡ trên giao dịch Fragment

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    //Setup the actionabar. Use setDrawableBackground to set a background image for the actionbar. 
    final ActionBar actionbar = getActionBar(); 
    actionbar.setDisplayShowTitleEnabled(false); 
    actionbar.setDisplayUseLogoEnabled(true); 
    actionbar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
    actionbar.addTab(actionbar.newTab().setText(R.string.home_tab_text).setTabListener(this),true); 
    actionbar.addTab(actionbar.newTab().setText(R.string.insert_tab_text).setTabListener(this)); 

    Fragment fragment = new insert_button_frag(); 
    FragmentTransaction transaction = getFragmentManager().beginTransaction(); 
    transaction.replace(R.id.button_fragment, fragment); 
    transaction.addToBackStack(null); 

    transaction.commit(); 
} 

Dưới đây là cách bố trí

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 

    <LinearLayout 
     android:orientation="vertical" 
     android:id="@+id/button_fragment_container" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" > 

     <fragment 
      android:name="com.bv.silveredittab.home_button_frag" 
      android:id="@+id/button_fragment" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" /> 

    </LinearLayout> 

    <LinearLayout 
     android:orientation="horizontal" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" > 

     <fragment 
      android:name="com.bv.silveredittab.quick_insert_frag" 
      android:id="@+id/quick_insert_frag" 
      android:layout_width="350dip" 
      android:layout_height="fill_parent" /> 

     <fragment 
      android:name="com.bv.silveredittab.editor_frag" 
      android:id="@+id/editor_frag" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" /> 

    </LinearLayout> 

</LinearLayout> 

Và đây là đoạn mã

public class insert_button_frag extends Fragment { 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     return inflater.inflate(R.layout.insert_buttons,container, false); 
    } 
} 

Giống như tôi đã nói. Tôi đã cố gắng tham khảo các đoạn xem cha mẹ mảnh để thay thế nó, và bản thân mảnh (theo id) và vẫn còn, nó chỉ thêm đoạn mới, bên trong khung nhìn có chứa phân đoạn ban đầu là in

+0

Có gì trong tệp chèn_buttons.xml? – Peter

Trả lời

33

tôi giải quyết điều này bằng cách sử dụng một trình giữ chỗ trong Layout của tôi và sau đó gắn Fragment của tôi để nó trong thời gian chạy.

Giống như bạn, nếu tôi đã khởi tạo Phân đoạn của tôi trong bố cục xml của mình thì nội dung sẽ vẫn hiển thị sau khi thay thế nó bằng một Phân đoạn khác khi chạy.

+4

Đó là những gì tôi đã phải làm. Kinda chậm lại không phải là nó? – Shaun

+2

Haha, vâng! Lỗi hoặc * Tính năng * Tôi tự hỏi. – Damian

+1

Chính xác. Có vẻ như phương pháp thay thế là vô dụng rồi. – Tastybrownies

2

Tôi có cùng một vấn đề. Hãy xem liên kết này: Android Fragment Duplication

Tôi tự hỏi nếu thực tế bạn đang chuyển vùng chứa vào phương thức inflater.inflate() khiến nó tạo phân đoạn mới bên trong vùng cũ thay vì bán buôn thay thế. Tôi đã cung cấp 'null' cho inflaters của tôi trong phiên bản làm việc.

Đây là yếu tố cần thiết từ các phiên bản tôi đã làm việc ...

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ 
    View newFrag = new View(getActivity().getApplicationContext()); 
    newFrag = inflater.inflate(R.id.frag, null); 
    return newFrag; 
} 
+0

Tôi đã nhìn vào nó, nhưng tôi không nghĩ rằng nó thực sự áp dụng cho tình hình của tôi. Im không điền các mảnh của tôi một cách progmatically. Đối với một số lý do mã của tôi không tìm thấy các mảnh hiện có, do đó, nó không thay thế nó. Nó thậm chí không tạo ra bất kỳ lỗi hoặc cảnh báo nào. Nó thực sự khó hiểu. – Shaun

+0

Xin lỗi vì đã không giúp được gì. Tôi chỉnh sửa lại câu trả lời của tôi: inflater, nhưng nếu điều đó không giúp được gì, tôi sẽ phải khắc phục sự cố nó với IDE. – Peter

+0

Tôi đã thử trở lại inflater.inflate (R.layout.home_buttons, null, false); nhưng điều đó đã không hoạt động hoặc – Shaun

18

Vấn đề là dòng này:

transaction.replace(R.id.button_fragment, fragment); 

replace có hai hình thức quá tải. Trong cả hai đối số, đối số đầu tiên là vùng chứa của Phân đoạn được thay thế, không phải là Fragment. Vì vậy, trong trường hợp của bạn, bạn cần phải gọi

transaction.replace(R.id.button_fragment_container, fragment); 

chỉnh sửa: Tôi thấy trong câu hỏi của bạn mà bạn đã thử cả hai. Tôi đã kiểm tra và xác minh hành vi. Điều này dường như là một lỗi trong API FragmentTransaction.

Chỉnh sửa2: không phải là lỗi. Bạn chỉ đơn giản là không thể thay thế các mảnh được thêm tĩnh trong tệp bố cục. Bạn chỉ có thể thay thế những người bạn đã thêm theo chương trình (Android: can't replace one fragment with another)

0

google developer guide khá khó hiểu vì nó hiển thị đầu tiên triển khai đoạn mã được mã hóa cứng trong bạn xml. Nhưng nếu bạn thực sự muốn thay thế đoạn hiện có bằng đoạn mới, thì bạn nên thêm đoạn mã đó (đoạn đầu tiên) vào lúc chạy.

official site nhà nước là

FragmentTransaction replace (int containerViewId, Fragment mảnh, String tag)

Thay thế một mảnh hiện đã được thêm vào một container. Đây là về cơ bản giống như gọi remove (Fragment) cho tất cả các đoạn hiện tại được thêm vào cùng một containerViewId và sau đó thêm thêm (int, Fragment, String) với cùng các đối số được đưa ra ở đây.

Bạn nên nhận thấy rằng nó nói rằng Thay thế một mảnh hiện có mà đã được bổ sung để chứa

Vì vậy, xml của bạn sẽ trông như thế someActivity.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    ... 
    tools:context="someActivity"> 

    <ImageView 
     .../> 

    <LinearLayout 
     android:id="@+id/fragment_container" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical" 
     android:gravity="bottom"/> 

</RelativeLayout> 

Và hơn hoạt động của bạn, hãy thực hiện theo số OnCreate()

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     [...] 
     getSupportFragmentManager().beginTransaction() 
       .add(R.id.fragment_container, new FirstFragment).commit(); 

    } 

Hơn bạn có thể dễ dàng thay thế đoạn bằng hoạt ảnh và sự kiện của bạn thêm đoạn đó vào ngăn xếp để lưu trạng thái của nó.

private SecondFrag getSecondFrag(){ 
    if(secondFrag == null) 
     secondFrag = new SecondFrag() 
    return secondFrag; 
} 

private void openRechargeFragment(){ 
     FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
     ft.setCustomAnimations(R.anim.show_frag, R.anim.hide_frag, 
       R.anim.show_frag, R.anim.hide_frag); 
     ft.replace(R.id.fragment_container, getSecondFrag(), "myTAG"); 
     ft.addToBackStack(null); 
     ft.commit(); 
} 
Các vấn đề liên quan