2011-11-17 16 views
35

Ho appena iniziato con il design dei frammenti per HoneyComb. Ho creato due frammenti. Quando faccio clic su un pulsante nel frammento del lato sinistro, viene creato un nuovo frammento nel lato destro. Nel frattempo quando clicco su un pulsante nel frammento destra (es. DetialsFragment nel mio codice qui sotto dovrebbe essere sostituito da un altro frammento. main.xmlAndroid sostituisce il frammento corrente con un altro frammento

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

risposta

83

quindi fornito il pulsante mostra e l'evento click viene licenziato è possibile chiamare il seguente nel vostro evento click:

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

e se si vuole tornare al DetailsFragment sulla cliccando schiena assicurarsi di aggiungere la transazione di cui sopra allo stack posteriore, ovvero

ft.addToBackStack(null); 

O mi manca qualcosa? In alternativa, alcune persone suggeriscono che la tua attività ottiene l'evento click per il pulsante e ha la responsabilità di sostituire i frammenti nel riquadro dei dettagli.

+3

Fornire tag di frammenti è facoltativo. Puoi fare 'ft.replace (R.id.details, new NewFragmentToReplace());' –

+0

Inoltre non dimenticare 'getFragmentManager(). ExecutePendingTransactions();' –

+2

I pulsanti non scompaiono dal frammento precedente. I pulsanti del vecchio frammento sono ancora visibili nella parte superiore del nuovo frammento. – Santanu

0

Puoi provare qui sotto il codice. è un metodo molto semplice per spingere il nuovo frammento dal vecchio frammento.

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

cosa è mcontainerid – Ayoub

+0

@Ayoub è la tua id .. esempio linearLayout.getId() in java – marlonpya

0

Usa android.support.v4.app per FragmentManager & FragmentTransaction nel codice, che ha lavorato per me.

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

è molto semplice come sostituire con Fragment.

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