web-dev-qa-db-fra.com

Possibilité d'ajouter des paramètres dans le bouton XML?

J'ai actuellement une activité avec des boutons.

Dans mon XML, les boutons sont définis comme suit:

    <ImageButton (...) Android:onClick="GoToPageX"/>

et j'ai dans mon activité:

public void GotoPageX() {
    startActivity(new Intent(this, PageX.class));
    finish();

}

Le problème est que j'ai des centaines de boutons et que je ne veux pas écrire

<ImageButton (...) Android:onClick="GoToPage1"/>
<ImageButton (...) Android:onClick="GoToPage2"/>
<ImageButton (...) Android:onClick="GoToPage3"/>
...
<ImageButton (...) Android:onClick="GoToPage100"/>

et tous les scripts.

J'utilise maintenant 

public void GotoPage( int i) {
    startActivity(new Intent(getBaseContext(), activities.get(i)));
    finish();
}

et voudrait donner le paramètre i du xml, est-ce possible?

Merci beaucoup pour toute aide.

36
Waza_Be

Ce n'est pas directement possible. Cependant, vous pourriez peut-être utiliser Android:tag pour obtenir votre paramètre.

<ImageButton (...) Android:onClick="goToPage" Android:tag="25"/>

public void goToPage(View v) {
    String pageNumber = v.getTag().toString(); 
    /* ... */
}
89
OcuS

Si vous voulez créer un élément de mise en page au format XML, vous pourrez l'utiliser

<ImageButton
    Android:id="@+id/some_id_value" />

some_id_value est une sorte de chaîne unique qui sera traduite en identifiant qui est conservé dans R.Java (mieux pour vous, n'y changez rien) que dans le code, vous pouvez obtenir cet identifiant en utilisant

R.id.some_id_value

lire un peu c'est vraiment des bases.

2
Robert

Vous pouvez définir des balises pour une vue. Les balises sont fondamentalement un moyen pour les vues d’avoir des souvenirs. 

xml:  

<ImageButton
    ...Other Parameters...
    Android:id="@+id/Button2"
    Android:tag="2"
    Android:onClick="GoToPageX"/>
<ImageButton
    ...Other Parameters...
    Android:id="@+id/Button3"
    Android:tag="3"
    Android:onClick="GoToPageX"/>

La ligne Android:tag="2" définit une valeur de balise de 2 (type de données chaîne) sur Button2

Fichier Java:  

Cas général:
Inside GoToPageX(View v) function, Utilisez v.getTag() pour obtenir la valeur de balise de la vue correspondante (De quelle vue la méthode a été appelée). 

Ton cas:
Ajouter la méthode comme suit

public void GoToPageX(View v){
    int i = Integer.parseInt(v.getTag()); //parseInt converts string to integer
    startActivity(new Intent(getBaseContext(), activities.get(i)));
    finish();
}
1
Jithin Pavithran

Pour ce faire, vous pouvez également activer la liaison de données et utiliser une expression lambda pour la valeur onClick. Cette méthode est particulièrement utile si vous prévoyez d’utiliser plusieurs entrées de types différents. Voici un exemple de simple MainActivity.xml dans lequel cette stratégie est utilisée.

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <data>
        <variable name="main" type="com.example.Android.myapp.MainActivity" />
    </data>
    <LinearLayout Android:orientation="vertical"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">
        <ImageButton (...) Android:onClick='@{() -> main.GotoPage(1,"one")}'/>
        <ImageButton (...) Android:onClick='@{() -> main.GotoPage(2,"two")}'/>
        <ImageButton (...) Android:onClick='@{() -> main.GotoPage(3,"three")}'/>
        ...
        <ImageButton (...) Android:onClick='@{() -> main.GotoPage(100,"one hundred")}'/>
    </LinearLayout>
</layout>

et dans MainActivity.Java

public void GotoPage(int i, String otherVariable) {
    /** code using i and otherVariable **/
}

UPDATE: Pour ceux qui ne savent pas comment configurer la liaison de données, je vais l'expliquer ici pour que vous n'ayez pas à chercher sur Google. Tout d’abord, activez dataBinding dans le fichier build.gradle :

Android {
    ...
    dataBinding {
        enabled = true
    }
    ...
}

Assurez-vous également que jcenter() se trouve dans vos référentiels.

Ensuite, allez au XML de la disposition où onClick sera utilisé et placez-la dans une balise layout avec une section data comme celle-ci:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <data>
        <variable name="main" type="com.example.Android.yourapp.MainActivity" />
    </data>
    <YourLayout>
        ...
    </YourLayout>
</layout>

Pour le paramètre variable de la balise type, vous devez indiquer la classe qui contiendra la fonction sur laquelle pointe onClick. Dans cet exemple, je vais utiliser la classe d'activité principale, nommée MainActivity dans mon projet de test.

Une fois votre mise en page encapsulée dans une balise layout comme dans l'exemple ci-dessus, nettoyez le projet dans Android Studio. Vous devrez peut-être également invalider le cache/redémarrer ou fermer et rouvrir Android Studio. 

Ensuite, si la disposition avec onClick pour laquelle vous essayez de configurer la liaison de données est identique à celle définie par setContentView dans votre classe d'activité principale, ouvrez le fichier qui contient votre classe d'activité principale. Si la présentation avec onClick pour laquelle vous essayez de configurer la liaison de données est gonflée par programme dans un autre fichier, ouvrez le fichier dans lequel la présentation est gonflée. 

Ajoutez ces importations à ce fichier:

import com.example.Android.yourapp.databinding.YourLayoutBinding;
import Android.databinding.DataBindingUtil;

La première classe que vous importez est générée lorsque vous nettoyez le projet (et devez éventuellement invalider le cache/redémarrage) et est automatiquement nommée d'après le fichier XML auquel vous avez ajouté l'encapsuleur layout. Si le fichier de présentation s'appelle your_layout.xml , la classe d'importation s'appellera YourLayoutBinding. Le chemin d'importation exact dépendra du nom et de la structure de votre application, mais il sera toujours au sein d'une classe parente databinding.

L'étape suivante dépend si la mise en page à laquelle vous ajoutez la liaison de données est définie avec setContentView ou est gonflée avec inflate. Les deux versions de l'étape suivante utilisent la méthode setMain. La méthode setMain est automatiquement générée et nommée à l'aide de la valeur du paramètre name dans le wrapper layout que nous avons ajouté. Puisque nous avons mis name="main", la méthode s'appelle setMain


Si la disposition à laquelle vous ajoutez des liaisons de données est identique à celle définie par setContentViewrecherchez la ligne de votre classe d'activité principale qui ressemble à setContentView(R.layout.your_layout); et modifiez-la pour qu'elle utilise DataBindingUtil.setContentView au lieu de setContentView, en ajoutant this comme premier argument. Utilisez binding.setMain pour faire pointer la variable main de la présentation vers l'activité en cours.

YourLayoutBinding binding = DataBindingUtil.setContentView(this, R.layout.your_layout);
binding.setMain(this);

Si la mise en page à laquelle vous ajoutez la liaison de données n'est pas définie par setContentView mais plutôt gonflée aller à l'endroit où elle est gonflée dans votre code. Ça devrait ressembler a quelque chose comme ca:

return inflater.inflate(R.layout.your_layout, container, false);

Modifiez-le pour utiliser DataBindingUtil.inflate, en ajoutant l'inflater précédent comme premier argument. Utilisez binding.setMain pour faire pointer la variable main de la présentation vers l'activité principale et utilisez binding.getRoot() pour obtenir la vue. Cela devrait finir comme ça:

YourLayoutBinding binding = DataBindingUtil.inflate(inflater, R.layout.your_layout, container, false);
binding.setMain((MainActivity) getActivity());
return binding.getRoot();

La liaison de données est maintenant prête à être utilisée. Ajoutez une fonction que onClick doit désigner dans votre classe d’activité principale.

public void exampleFunction(int number, String text) {
    System.out.println("Number: " + number + ", Text: " + text);
}

Vous pouvez l'appeler depuis la mise en page à laquelle vous avez ajouté la liaison de données, à l'aide d'une expression lambda. Cet exemple de fonction ne nécessite pas de View, il peut donc être utilisé comme ceci:

<Button Android:id="@+id/buttonID"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:textSize="26sp"
    Android:text="Test"
    Android:onClick='@{() -> main.exampleFunction(123, "test")}'/>

Veillez à utiliser des guillemets simples autour de la valeur de onClick si vous prévoyez d'utiliser une entrée String

Si vous avez besoin de passer la vue du bouton à votre fonction, ajoutez simplement un paramètre View aux arguments requis de votre fonction et utilisez une expression lambda comme celle-ci:

<Button Android:id="@+id/buttonID"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:textSize="26sp"
    Android:text="Test"
    Android:onClick='@{(view) -> main.exampleFunction(view, 123, "test")}'/>
0
omikes