web-dev-qa-db-fra.com

Bouton Listener pour le bouton dans le fragment dans Android

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.

29
Bot

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

58
Ragaisis

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;
        }   
    }
8
TomasVeras

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);
      }
  }
}
3
user4813855

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.

2

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);
...
}
0
Yao Hao
    //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;
          }
    }     }
0
sandhu

Essaye ça :

FragmentOne.Java

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

0
pathe.kiran

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();   

     }
0
Piyush jain

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
}
0
ashfak