Je suis nouveau sur Android et j'essaie d'apprendre par moi-même. Mais j'ai des difficultés avec Fragments. Je crée une application simple pour apprendre des fragments. Je pense que cela peut sembler idiot, mais je ne peux vraiment pas que cela fonctionne.
Tout ce que je veux faire, c'est cliquer sur un bouton (buttonSayHi) dans Fragment_One, Fragment_One doit être remplacé par Fragment_Two.
Je ne sais pas quand le code de fragment est appelé ni où je suis censé écrire mon code pour appeler le deuxième fragment. J'ai l'erreur: Impossible de démarrer le composant d'activité.
Cependant, le code fonctionne bien si je supprime le programme d'écoute pour le bouton et que le fragment est affiché dans l'activité.
J'ai fait des recherches considérables, lisez le tutoriel de fragments sur developer.Android.com ainsi que le tutoriel de Lars Vogella. Je pense que mes concepts ne sont pas clairs.
Toute aide serait appréciée.
Voici le code:
activity_main.xml
<FrameLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/frameLayoutFragmentContainer"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent" >
</FrameLayout>
fragment_one.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:orientation="vertical" >
<EditText
Android:id="@+id/editTextPersonName"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:ems="10"
Android:inputType="textPersonName" >
<requestFocus />
</EditText>
<Button
Android:id="@+id/buttonSayHi"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:text="Say Hi"
Android:onClick="onButtonClicked"/>
</LinearLayout>
fragment_two.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:orientation="vertical" >
<TextView
Android:id="@+id/textViewResult"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:text="I will say Hi!" />
</LinearLayout>
MainActivity.Java
package com.example.fragmenttutorial;
import Android.os.Bundle;
import Android.view.View;
import Android.widget.Button;
import Android.app.Activity;
import Android.app.Fragment;
import Android.app.FragmentManager;
import Android.app.FragmentTransaction;
public class MainActivity extends Activity{
View view;
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Fragment fragmentOne = new FragmentOne();
fragmentTransaction.add(R.id.frameLayoutFragmentContainer, fragmentOne);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
}
protected void onButtonClicked()
{
if(view.getId() == R.id.buttonSayHi){
Fragment fragmentTwo = new FragmentTwo();
fragmentTransaction.replace(R.id.frameLayoutFragmentContainer, fragmentTwo);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
}
}
}
FragmentOne.Java
package com.example.fragmenttutorial;
import Android.app.Fragment;
import Android.app.FragmentManager;
import Android.app.FragmentTransaction;
import Android.os.Bundle;
import Android.view.LayoutInflater;
import Android.view.View;
import Android.view.ViewGroup;
public class FragmentOne extends Fragment{
View view;
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_one, container, false);
return view;
}
// protected void onButtonClicked()
// {
// if(view.getId() == R.id.buttonSayHi){
// Fragment fragmentTwo = new FragmentTwo();
//
// fragmentTransaction.replace(R.id.frameLayoutFragmentContainer, fragmentTwo);
// fragmentTransaction.addToBackStack(null);
//
// fragmentTransaction.commit();
//
// }
//
// }
}
J'ai commenté le code de clic dans le fragment. J'ai également essayé d'implémenter onClickListener dans le fragment.
FragmentTwo.Java
package com.example.fragmenttutorial;
import Android.app.Fragment;
import Android.os.Bundle;
import Android.view.LayoutInflater;
import Android.view.View;
import Android.view.ViewGroup;
public class FragmentTwo extends Fragment{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_two, container, false);
return view;
}
}
EDIT: J'ai supprimé la ligne Android: onClick = "onButtonClicked" de mon code en XML. Et édité les fichiers suivants mais cela ne fonctionne toujours pas. Pouvez-vous me donner un exemple de travail sans Android: onClick = "onButtonClicked" ligne.
MainActivity.Java
package com.example.fragmenttutorial;
import Android.os.Bundle;
import Android.view.View;
import Android.app.Activity;
import Android.app.Fragment;
import Android.app.FragmentManager;
import Android.app.FragmentTransaction;
public class MainActivity extends Activity{
View view;
Fragment fragmentOne;
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
fragmentOne = new FragmentOne();
fragmentTransaction.add(R.id.frameLayoutFragmentContainer, fragmentOne);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
}
}
FragmentOne.Java
package com.example.fragmenttutorial;
import Android.app.Fragment;
import Android.app.FragmentManager;
import Android.app.FragmentTransaction;
import Android.os.Bundle;
import Android.view.LayoutInflater;
import Android.view.View;
import Android.view.View.OnClickListener;
import Android.view.ViewGroup;
import Android.widget.Button;
public class FragmentOne extends Fragment implements OnClickListener{
View view;
Fragment fragmentTwo;
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_one, container, false);
Button buttonSayHi = (Button) view.findViewById(R.id.buttonSayHi);
buttonSayHi.setOnClickListener(this);
return view;
}
@Override
public void onClick(View v) {
fragmentTwo = new FragmentTwo();
fragmentTransaction.replace(R.id.frameLayoutFragmentContainer, fragmentTwo);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
}
}
Merci pour vos précieuses suggestions.
Votre classe de fragment doit implémenter OnClickListener
public class SmartTvControllerFragment extends Fragment implements View.OnClickListener
Puis obtenez la vue, le bouton de lien et définissez onClickListener comme dans l'exemple ci-dessous
View view;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
view = inflater.inflate(R.layout.smart_tv_controller_fragment, container, false);
upButton = (Button) view.findViewById(R.id.smart_tv_controller_framgment_up_button);
upButton.setOnClickListener(this);
return view;
}
Ajoutez ensuite la méthode onClickListener et faites ce que vous voulez.
@Override
public void onClick(View v) {
//do what you want to do when button is clicked
switch (v.getId()) {
case R.id.textView_help:
switchFragment(HelpFragment.TAG);
break;
case R.id.textView_settings:
switchFragment(SettingsFragment.TAG);
break;
}
}
Ceci est mon exemple de code, mais j'espère que vous avez compris
Utilisez votre code
public class FragmentOne extends Fragment implements OnClickListener{
View view;
Fragment fragmentTwo;
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_one, container, false);
Button buttonSayHi = (Button) view.findViewById(R.id.buttonSayHi);
buttonSayHi.setOnClickListener(this);
return view;
}
Mais je pense qu'il vaut mieux manipuler les boutons de cette façon:
@Override
public void onClick(View v) {
switch(v.getId()){
case R.id.buttonSayHi:
/** Do things you need to..
fragmentTwo = new FragmentTwo();
fragmentTransaction.replace(R.id.frameLayoutFragmentContainer, fragmentTwo);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
*/
break;
}
}
Fragment Listener
Si un fragment
doit communiquer events
à activity
, le fragment
doit définir un interface
comme type interne et exiger que le activity
doit implement
this interface
:
import Android.support.v4.app.Fragment;
public class MyListFragment extends Fragment {
// ...
// Define the listener of the interface type
// listener is the activity itself
private OnItemSelectedListener listener;
// Define the events that the fragment will use to communicate
public interface OnItemSelectedListener {
public void onRssItemSelected(String link);
}
// Store the listener (activity) that will have events fired once the fragment is attached
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
if (activity instanceof OnItemSelectedListener) {
listener = (OnItemSelectedListener) activity;
} else {
throw new ClassCastException(activity.toString()
+ " must implement MyListFragment.OnItemSelectedListener");
}
}
// Now we can fire the event when the user selects something in the fragment
public void onSomeClick(View v) {
listener.onRssItemSelected("some link");
}
}
puis dans la activity
:
import Android.support.v4.app.FragmentActivity;
public class RssfeedActivity extends FragmentActivity implements
MyListFragment.OnItemSelectedListener {
DetailFragment fragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_rssfeed);
fragment = (DetailFragment) getSupportFragmentManager()
.findFragmentById(R.id.detailFragment);
}
// Now we can define the action to take in the activity when the fragment event fires
@Override
public void onRssItemSelected(String link) {
if (fragment != null && fragment.isInLayout()) {
fragment.setText(link);
}
}
}
Vous devez seulement avoir une vue de l'activité portant ce fragment et cela ne peut se produire que lorsque votre fragment est déjà créé.
écrasez la méthode onViewCreated()
dans votre fragment et profitez de sa magie :) ..
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
Button button = (Button) view.findViewById(R.id.YOURBUTTONID);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//place your action here
}
});
J'espère que cela pourrait vous aider.
Cela fonctionne pour moi.
private OnClickListener mDisconnectListener;
mDisconnectListener = new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
}
};
...
... onCreateView(...){
mButtonDisconnect = (Button) rootView.findViewById(R.id.button_disconnect);
mButtonDisconnect.setOnClickListener(mDisconnectListener);
...
}
//sure run it i will also test it
//we make a class that extends with the fragment
public class Example_3_1 extends Fragment implements OnClickListener
{
View vi;
EditText t;
EditText t1;
Button bu;
// that are by defult function of fragment extend class
@Override
public View onCreateView(LayoutInflater inflater,ViewGroup container,BundlesavedInstanceState)
{
vi=inflater.inflate(R.layout.example_3_1, container, false);// load the xml file
bu=(Button) vi.findViewById(R.id.button1);// get button id from example_3_1 xml file
bu.setOnClickListener(this); //on button appay click listner
t=(EditText) vi.findViewById(R.id.editText1);// id get from example_3_1 xml file
t1=(EditText) vi.findViewById(R.id.editText2);
return vi; // return the view object,that set the xml file example_3_1 xml file
}
@Override
public void onClick(View v)//on button click that called
{
switch(v.getId())// on run time get id what button os click and get id
{
case R.id.button1: // it mean if button1 click then this work
t.setText("UMTien"); //set text
t1.setText("programming");
break;
}
} }
Essaye ça :
import Android.app.Fragment;
import Android.app.FragmentManager;
import Android.app.FragmentTransaction;
import Android.os.Bundle;
import Android.view.LayoutInflater;
import Android.view.View;
import Android.view.ViewGroup;
import Android.widget.Button;
public class FragmentOne extends Fragment{
View rootView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
rootView = inflater.inflate(R.layout.fragment_one, container, false);
Button button = (Button) rootView.findViewById(R.id.buttonSayHi);
button.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
onButtonClicked(v);
}
});
return rootView;
}
public void onButtonClicked(View view)
{
//do your stuff here..
final FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.frameLayoutFragmentContainer, new FragmentTwo(), "NewFragmentTag");
ft.commit();
ft.addToBackStack(null);
}
}
vérifier ceci: cliquez ici
Passez simplement l'objet view à la fonction onButtonClicked. getView () ne semble pas fonctionner comme prévu dans fragment .. .. Essayez ce code pour votre fragment FragmentOne
PS. vous avez redéfini la vue d'objet dans votre code FragmentOne d'origine.
package com.example.fragmenttutorial;
import Android.app.Fragment;
import Android.app.FragmentManager;
import Android.app.FragmentTransaction;
import Android.os.Bundle;
import Android.view.LayoutInflater;
import Android.view.View;
import Android.view.ViewGroup;
public class FragmentOne extends Fragment{
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_one, container, false);
onButtonClicked(view);
return view;
}
protected void onButtonClicked(View view)
{
if(view.getId() == R.id.buttonSayHi){
Fragment fragmentTwo = new FragmentTwo();
fragmentTransaction.replace(R.id.frameLayoutFragmentContainer, fragmentTwo);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
}
Pendant que vous déclarez onclick en XML, vous devez alors déconnecter la méthode, passer View v en tant que paramètre et rendre la méthode publique ...
Ex:
//in xml
Android:onClick="onButtonClicked"
// in Java file
public void onButtonClicked(View v)
{
//your code here
}