Je viens de commencer avec la conception de fragments pour HoneyComb. J'ai créé deux fragments. Lorsque je clique sur un bouton dans le fragment de gauche, un nouveau fragment est créé dans le côté droit. En attendant, lorsque je clique sur un bouton du fragment de droite (c'est-à-dire, DetialsFragment dans mon code ci-dessous doit être remplacé par un autre fragment .
<?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);
}
}
Titres.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;
}
}
DétailsFragment.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;
}
}
Ensuite, si votre bouton est affiché et que l'événement click est déclenché, vous pouvez appeler les éléments suivants dans votre événement click:
final FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.details, new NewFragmentToReplace(), "NewFragmentTag");
ft.commit();
et si vous souhaitez revenir à DetailsFragment en cliquant en arrière, assurez-vous d’ajouter la transaction ci-dessus à la pile arrière, c.-à-d.
ft.addToBackStack(null);
Ou est-ce que je manque quelque chose? Certaines personnes peuvent également suggérer que votre activité obtienne l'événement click pour le bouton et qu'il soit chargé de remplacer les fragments dans votre volet d'informations.
Vous pouvez essayer ci-dessous le code. c’est une méthode très facile pour Push new fragment from old fragment.
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
}
}
Utilisez Android.support.v4.app
pour FragmentManager & FragmentTransaction dans votre code, cela a fonctionné pour moi.
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();
c'est très simple comment remplacer par Fragment.
DataFromDb changeActivity = new DataFromDb();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.changeFrg, changeActivity);
transaction.commit();