2011-11-17 5 views
35

Tôi vừa mới bắt đầu với thiết kế mảnh cho HoneyComb. Tôi đã tạo ra hai mảnh. Khi tôi bấm vào một nút ở phần bên trái, một đoạn mới sẽ được tạo ra ở phía bên phải. Trong khi đó khi tôi bấm một nút ở đoạn bên phải (tức là DetialsFragment. Trong mã của tôi dưới đây sẽ được thay thế bằng đoạn khác. main.xmlAndroid thay thế đoạn hiện tại bằng một đoạn khác

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="horizontal" > 
    <fragment class="com.fragment.example.Titles" 
     android:id="@+id/titles" android:layout_weight="1" 
     android:layout_width="0px" 
     android:layout_height="match_parent" /> 
    <FrameLayout android:id="@+id/details" android:layout_weight="1" 
     android:layout_width="0px" 
     android:layout_height="match_parent" /> 

</LinearLayout> 

FragmentExample.java

public class FragmentExample extends Activity { 
/** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
    } 
} 

Titles.java

public class Titles extends Fragment { 
    public FragmentTransaction ft; 
    @Override 
    public View onCreateView(LayoutInflater inflater, 
     ViewGroup container, Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.main1, null); 
     Button button1 = (Button)v.findViewById(R.id.button1); 
     button1.setText("santhosh"); 
     button1.setOnClickListener(new OnClickListener() { 



      @Override 
      public void onClick(View arg0) { 
       // TODO Auto-generated method stub 
       DetailsFragment details = (DetailsFragment) 
          getFragmentManager().findFragmentById(R.id.details); 
        if (details == null || details.getShownIndex() != 1) { 
         // Make new fragment to show this selection. 
         details = DetailsFragment.newInstance(1); 

         // Execute a transaction, replacing any existing 
         // fragment with this one inside the frame. 
         ft 
           = getFragmentManager().beginTransaction(); 
         ft.add(R.id.details, details, "detail"); 
         ft.setTransition(
           FragmentTransaction.TRANSIT_FRAGMENT_FADE); 
         ft.commit(); 
        } 
      } 

     }); 
     return v; 
    } 
} 

DetailsFragment.java

public class DetailsFragment extends Fragment { 
    /** 
    * Create a new instance of DetailsFragment, initialized to 
    * show the text at 'index'. 
    */ 
    Titles title = new Titles(); 
    String[] titles = {"Title1", "Title2", "Title3", "Title4"}; 
    public static DetailsFragment newInstance(int index) { 
     DetailsFragment f = new DetailsFragment(); 

     // Supply index input as an argument. 
     Bundle args = new Bundle(); 
     args.putInt("index", index); 
     f.setArguments(args); 

     return f; 
    } 

    public int getShownIndex() { 
     return getArguments().getInt("index", 0); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, 
     ViewGroup container, Bundle savedInstanceState) { 
     if (container == null) { 
      // Currently in a layout without a container, so no 
      // reason to create our view. 
      return null; 
     } 
     Button button = new Button(getActivity()); 
     button.setText("Next"); 
     button.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
      } 
     }); 
     return button; 
    } 
} 

Trả lời

83

Sau đó cung cấp nút của bạn được hiển thị và sự kiện nhấp chuột là bị sa thải bạn có thể gọi như sau trong sự kiện click của bạn:

final FragmentTransaction ft = getFragmentManager().beginTransaction(); 
ft.replace(R.id.details, new NewFragmentToReplace(), "NewFragmentTag"); 
ft.commit(); 

và nếu bạn muốn quay trở lại DetailsFragment trên nhấn trở lại đảm bảo bạn thêm giao dịch trên ở ngăn xếp lại, tức là

ft.addToBackStack(null); 

Hoặc tôi có thiếu gì đó không? Ngoài ra, một số người cho rằng hoạt động của bạn nhận được sự kiện nhấp cho nút và nó có trách nhiệm thay thế các đoạn trong ngăn chi tiết của bạn.

+3

Cung cấp thẻ phân đoạn là tùy chọn. Bạn có thể làm 'ft.replace (R.id.details, newFragmentToReplace());' –

+0

Cũng đừng quên 'getFragmentManager(). ExecutePendingTransactions();' –

+2

Các nút không biến mất khỏi đoạn trước. Các nút của đoạn cũ vẫn hiển thị trên đầu đoạn mới. – Santanu

0

Bạn có thể thử mã bên dưới. đó là phương pháp rất dễ dàng để đẩy đoạn mới từ đoạn cũ.

private int mContainerId; 
private FragmentTransaction fragmentTransaction; 
private FragmentManager fragmentManager; 
private final static String TAG = "DashBoardActivity"; 

public void replaceFragment(Fragment fragment, String TAG) { 

    try { 
     fragmentTransaction = fragmentManager.beginTransaction(); 
     fragmentTransaction.replace(mContainerId, fragment, tag); 
     fragmentTransaction.addToBackStack(tag); 
     fragmentTransaction.commitAllowingStateLoss(); 

    } catch (Exception e) { 
     // TODO: handle exception 
    } 

} 
+0

mcontainerid là gì – Ayoub

+0

@Ayoub là u id xem .. ví dụ linearLayout.getId() trong java – marlonpya

0

Sử dụng android.support.v4.app cho FragmentManager & FragmentTransaction trong mã của bạn, nó đã làm việc cho tôi.

DetailsFragment detailsFragment = new DetailsFragment(); 
android.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager(); 
android.support.v4.app.FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
fragmentTransaction.replace(R.id.details,detailsFragment); 
fragmentTransaction.commit(); 
0

rất đơn giản cách thay thế bằng Phân đoạn.

DataFromDb changeActivity = new DataFromDb(); 
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 
    transaction.replace(R.id.changeFrg, changeActivity); 
    transaction.commit();