web-dev-qa-db-fra.com

Android: Comment mettre à jour mon textView dans un fragment

J'essaie d'utiliser des fragments pour créer ma première application Android .. .. J'ai un fichier XML principal. qui se compose de deux fragments verticaux, les fragments du haut se compose de seulement deux TextViews. Le premier contient du texte statique et le second contient une valeur que j'obtiendrai de manière dynamique à partir de SQL.

Si je mets ceci est mon MainActivity.Java, alors il met heureusement à jour la valeur de TextView dans mon premier fragment:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    // Set the Text to try this out
    TextView t = (TextView)findViewById(R.id.viewItem);
    t.setText("Text to Display");
}

J'ai deux fragments XML et un Java pour les prendre en charge. Je souhaite donc définir le paramètre de ce champ dans Java qui prend en charge le fragment plutôt que dans Java pour MainActivity.

Quand je le mets dans le fragment, cela ressemble à ceci: -

    public class FragmentMainTop extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater,
        ViewGroup container, Bundle savedInstanceState){
    // -- inflate the layout for this fragment
    return inflater.inflate(R.layout.fragmentmt, container,false);

    // Set the Text to try this out
    TextView t = (TextView)findViewById(R.id.viewItem);
    t.setText("Text to Display");
}

Mais si je le fais, j'obtiens une erreur sur la ligne TextView:

"La méthode findViewById (int) n'est pas définie pour le type FragmentMainTop"

Alors pourquoi ne connait-il pas cette méthode? J'ai ctl/shift/o donc je sais que j'ai tous les droits d'importation . Je ne veux pas finir par mettre tout mon code dans MainActivity car si je veux utiliser ensuite le fragment dans une autre activité, je l'aurai répéter tout le code.

14
RobT

Vous devez affecter la disposition du fragment gonflé à une variable afin de pouvoir accéder à sa méthode findViewById(). Ensuite, vous le retournez une fois que vous avez terminé de mettre à jour vos widgets. 

@Override
public View onCreateView(LayoutInflater inflater,
        ViewGroup container, Bundle savedInstanceState){
    // -- inflate the layout for this fragment
    View myInflatedView = inflater.inflate(R.layout.fragmentmt, container,false);

    // Set the Text to try this out
    TextView t = (TextView) myInflatedView.findViewById(R.id.viewItem);
    t.setText("Text to Display");

    return myInflatedView;
}

Normalement, lorsque vous appelez findViewById() dans une Activity, vous appelez Activity.findViewById(). Essayer le même appel dans votre classe Fragment échouera car il n’existe pas de telle méthode Fragment.findViewById(). Donc, vous devez utiliser View.findViewById() avec votre vue gonflée pour obtenir des références à vos widgets.

46
Tyler MacDonell

Je ne suis pas un expert, mais je dirais que l'instruction return d'une méthode renvoie quelque chose et que les lignes suivantes après cette instruction sont inaccessibles: O

Alors essayez de changer l'ordre! :)

2
Husky

J'utilise ce code de mon activité pour mettre à jour une vue de texte ajoutée dans une balise xml. Le textview sont des objets de niveau classe. Heres du code:

<fragment
    Android:id="@+id/fragmentRegister"
    Android:name="com.proshore.loveis.RegisterFragment"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:layout_alignParentLeft="true"
    Android:layout_below="@+id/view1" />

Voici le code de fragment montrant simplement la variable de niveau de classe.

public class RegisterFragment extends Fragment implements OnClickListener {

TextView textViewDOB, textViewLanguage;

public RegisterFragment() {
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
//eluded methods here
}
}

Maintenant l'activité depuis laquelle je mets à jour mon fragment:

public class RegisterActivity extends FragmentActivity {
Button buttonEnter;
RegisterFragment fragmentRegister;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_register);
    buttonEnter = (Button) findViewById(R.id.buttonEnter);
    fragmentRegister = (RegisterFragment) getSupportFragmentManager()
            .findFragmentById(R.id.fragmentRegister);
}

@Override
protected void onStart() {
    // TODO Auto-generated method stub
    super.onStart();
    buttonEnter.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            Log.d("dontknowitwillowrk", fragmentRegister.textViewLanguage
                    .getText().toString());
            fragmentRegister.textViewLanguage.setText("hello mister how do you do");


        }
    });
}
}

Remarque: pas sûr que ce soit un bon moyen.

0
Illegal Argument