2011-11-17 222 views
35

我剛開始使用HoneyComb的片段設計。我創建了兩個片段。當我點擊左側片段中的按鈕時,右側會創建一個新片段。同時,當我在正確的片段點擊一個按鈕(即下文中我的代碼。DetialsFragment應該由另一個片段所取代。 main.xml中Android將當前片段替換爲另一個片段

<?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; 
    } 
} 

回答

83

然後提供您的按鈕,在顯示和點擊事件被解僱,你可以調用在點擊事件如下:

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

,如果你想回去DetailsFragment上單擊後退確保您添加上面的交易到回棧,即

ft.addToBackStack(null); 

或者我錯過了什麼?或者,某些人建議您的活動獲取該按鈕的單擊事件,並負責替換詳細信息窗格中的片段。

+3

提供片段標籤是可選的。您可以執行'ft.replace(R.id.details,new NewFragmentToReplace());' –

+0

也不要忘記'getFragmentManager()。executePendingTransactions();' –

+2

按鈕不會消失前一個片段。舊片段的按鈕在新片段的頂部仍然可見。 – Santanu

0

您可以嘗試下面的代碼。這是從舊片段推新片段的非常簡單的方法。

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 – Ayoub

+0

@Ayoub是你的view id ..例子linearLayout.getId()in java – marlonpya

0

使用android.support.v4.app代碼中的FragmentManager & FragmentTransaction,它已經爲我工作。

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

這是非常簡單的如何用片段替換。

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