当前位置:网站首页>Android construit l'architecture mvvm à partir de zéro (1) (1), fonction anonyme kotlin

Android construit l'architecture mvvm à partir de zéro (1) (1), fonction anonyme kotlin

2022-01-15 02:24:17 Mb61c1dbbb44788

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_main);
//Après avoir écrit ça,Le code ci - dessus peut être commenté Oh
binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
}

Vous pouvez également personnaliser le nom de la classe de construction,Ici, j'ai personnalisé le nom de la classeMyBinding

<data class=“MyBinding”>

</data>

1.1、Définir les données et cliquer sur l'événement

InxmlÀ l'intérieur.<data>Étiquette avec les données à définir,J'en ai un ici.String,Il y a unOnClickListener:

  • <variable>Dans l'étiquette nameéquivalent à une référence de données
  • type Est le type de données,Peut également être compris comme le nom du paquet.Nom de la classe.Types de données communs,Type d'écriture directe
  • Lors du réglage de la valeur, utilisez@{value},valueC'est<variable>Référence des données dans

<?xml version=“1.0” encoding=“utf-8”?>
<layout xmlns:android=“ http://schemas.android.com/apk/res/android
xmlns:tools=“ http://schemas.android.com/tools”>

<data>

<variable
name=“textStr”
type=“String” />

<variable
name=“onClickListener”
type=“android.view.View.OnClickListener” />

</data>

<RelativeLayout
android:layout_width=“match_parent”
android:layout_height=“match_parent”

<TextView
android:id=“@+id/txt”
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:text=“@{textStr}”
android:onClick=“@{onClickListener}”
/>

</RelativeLayout>
</layout>

Alors, dansActivity Définir les données et les paramètres cliquer sur l'événement ( Le sens est défini variableAprès l'étiquetteDataBindingSera généré automatiquementgetEtsetMéthodes.studio3.5 Juste après. xmlÉcris.,IDESera généré automatiquement, Les versions inférieures peuvent nécessiter Make ProjectEn bas.). Voici une mise en place des données , Et set Click Event .

Le code suivant montre , Il suffit de lier la disposition inférieure ,AdoptionBindingObjet,Peut faire n'importe quoi. Ne plus jamais utiliser findViewById,OubutterKnife.

public class BaseUseActivity extends AppCompatActivity implements View.OnClickListener {
private ActivityBaseuseBinding baseuseBinding;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_baseuse);
baseuseBinding = DataBindingUtil.setContentView(this, R.layout.activity_baseuse);
baseuseBinding.setTextStr(“Vous pouvez définir les données ici”);
baseuseBinding.setOnClickListener(this);
}

@Override
public void onClick(View v) {
baseuseBinding.txt.setText(“Cliquez sur les données définies”);
}
}

Vous pouvez également appeler les méthodes de la classe ici,Et une attention particulière est nécessaire,En serviceDataBindingQuand,Le nom du paquet doit être en minuscules,Sinon, le nom du paquet n'a pas pu être trouvé,Supposons que nous définissions une classe ici,Puis appelez la méthode dans la classe.

public class OnClickUtil {

public void onClickWithMe(View view) {
Toast.makeText(view.getContext(), “Appelez la méthode dans la classe”, Toast.LENGTH_SHORT).show();
}
}

Les autres étapes sont les mêmes,La seule différence est,Les méthodes de la classe d'appel sont écrites différemment.HypothèsesbuttonCliquez sur appel.Avec::Représente un appel,Suivi du nom de la méthode.

<Button

android:onClick=“@{onClickUtil::onClickWithMe}”
/>

1.2、<import>Et aliasaliasUtilisation de

Ici, nous définissons d'abord2CatégoriesUser.Dans différents sacs.

public class User {
private String name;
private int age;

public User(String name, int age) {
this.name = name;
this.age = age;
}
}

Avant notre<data>L'étiquette peut être utilisée<import>.

<data>
<import type=“com.lihang.databindinglover.bean.User”/>

<variable
name=“use_first”
type=“User” />
</data>

<import>Est utilisé dans le mêmexmlÇa doit être utilisé plusieurs foisUserQuand,typeLe type n'a besoin que d'écrire<import>Le nom de la classe peut représenter,Il n'est pas nécessaire d'écrire toujours le nom du paquet.Type.Mais ça arrive aussi à ce moment - là2Les classes avec différents paquets du même nom sont nécessairesaliasAlias,Sinon, le nom de la classe est répété.

<data>
<import type=“com.lihang.databindinglover.bean.User”/>

<import
alias=“loverUser”
type=“com.lihang.databindinglover.User”/>

<variable
name=“user_first”
type=“User” />

<variable
name=“user_second”
type=“loverUser” />
</data>

ActivityTout est très simple à utiliser,S'il y a un problème,Libérez le lien plus tard.

Il y a aussi des fonctions spéciales ici,Comme la mise en page de la page d'aperçu.En général, on utilise **tools:text=“Intermédiaire”**Pour prévisualiser la mise en page,C'est le moment de passer

<TextView
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:text=“@{user.name,default = Texte d'aperçu}”
/>

UtiliserdefaultQuand,Même sistudio3.5- Oui.,Pas de rappel,Mais ça n'a pas d'impact..Encore un peu.,InDataBinding- Oui.,C'est déjà faitnull.C'est pour ça que tu esActivityTiens.userSet tonull.Et ne s'effondrera pas.

2.、DataBindingInFragmentEtRecyclerViewUtilisation de

InFragmentUtilisation etActivityIl est utilisé de la même façon.La façon d'obtenir le Répertoire racine est la suivante.

//Notez que la disposition racine est
View view = activityAlisBinding.getRoot();

Je vais mettre l'accent surrecyclerViewUtilisation de.Est - ce qu'on écrivaitViewHolderJ'en ai marre d'écrire?Ça marche.DataBindingAprès,Je vais te direViewHolderPour faire tout ce qu'il fautViewHolder

Regardez d'abord notre seulViewHolder.Tout d'abord,Généré automatiquementBindingLes parents deViewDataBinding.C'est moi.ViewHolderIl est sorti seul.Pour que tout le monde puisse:

public class NewViewHolder extends RecyclerView.ViewHolder {
public ViewDataBinding binding;

public NewViewHolder(ViewDataBinding binding) {
super(binding.getRoot());
this.binding = binding;
}
}

InAdapterTout ce qu'il faut, c'est une carrière

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
ItemNewOrderBinding binding = DataBindingUtil.inflate(LayoutInflater.from(viewGroup.getContext()), R.layout.item_new_order, viewGroup, false);
return new NewViewHolder(binding);
}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
NewViewHolder newViewHolder = (NewViewHolder) viewHolder;
//Si plusieurs mises en page,Alors oui.bindingFaire un instansofUn bon jugement.Comme ça.ViewHolderIl n'y a qu'un seul
ItemNewOrderBinding binding = (ItemNewOrderBinding) newViewHolder.binding;
binding.txtName.setText(“Pour pouvoir utiliser!!”);
}

Trois、Liaison unidirectionnelle des données

Une liaison unidirectionnelle peut être interprétée comme,Ça a changé.beanDonnées dans l'objet,Ça nous change automatiquementxmlAffichage de.Il s'agit de3Catégories: BaseObservable、ObservableField、ObservableCollection.Regardez ce nom pour voir qu'il ressemble un peu au modèle de l'observateur

3.1、BaseObservable

Tout d'abord, nous définissonsDogCatégorie

public class Dog extends BaseObservable {

//Si ouipublicDécoré,Utilisation directe@Bindable
@Bindable
public String name;
//Si ouiprivateDécoré,DansgetUtilisation de la méthode@Bindable
private String color;

public void setDataOnlyName(String name, String color) {
this.name = name;
this.color = color;
//Brosse seulementnameChamp
notifyPropertyChanged(com.lihang.databindinglover.BR.name);
}

public void setDataAll(String name, String color) {
this.name = name;
this.color = color;
//Rafraîchir tous les champs
notifyChange();
}
…//Omettre certains codes
}

Mon collègue a changénameEtcolorCouleur,Description

  • beanL'objet doit hériter BaseObservable
  • @Bindable Indique quel champ nécessite une liaison unidirectionnelle.publicLes modificateurs peuvent être utilisés directement@BindableBIND.privateLe besoin de retouches estget()Pour la méthode@BindableDimensions
  • notifyChange();Rafraîchir tous les champs,notifyPropertyChanged(com.lihang.databindinglover.BR.name);Rafraîchir les champs individuels.Notez que les rafraîchissements dont il est question ici sont tous@BindableLié.SiBR.nameJe ne peux pas sortir..SuggestionbuildPoint suivant
  • Il y a aussi des liens qui ne sont pas clairs à la findemoRegarde.:Liaison unidirectionnelle des données – BaseObservable.

AndroidConstruire à partir de zéroMVVMArchitecture(1)(1),kotlinFonction anonyme_Programmeur

HéritéBaseObservableDebeanObjet,Vous pouvez également écouter où rafraîchir

dog.addOnPropertyChangedCallback(new Observable.OnPropertyChangedCallback() {
@Override
public void onPropertyChanged(Observable sender, int propertyId) {
if (propertyId == com.lihang.databindinglover.BR.name) {
Log.e(“Regarde ce qui est rafraîchi”, “Rafraîchirname”);
} else if (propertyId == com.lihang.databindinglover.BR._all) {
Log.e(“Regarde ce qui est rafraîchi”, “Tout ça”);
} else {
Log.e(“Regarde ce qui est rafraîchi”, “Erreur inconnue~”);
}
}
});

3.2、ObservableField

En fait, ça.ObservableFieldC'est ça.BaseObservableSimplification,Pas besoin d'hériter,Pas besoin de rafraîchir activement le Code.
Nous sommes les derniersHumanCatégorie

public class Human {
//Il doit y avoir une constante ici,ObservableField<Type de paramètre>
//En fait, c'est écrit,C'estBaseObservable,set,get, @Bindable,Les rafraîchissements sont encapsulés.Regardez directement la méthode de construction
public final ObservableField<String> name = new ObservableField<>();
//Les types de données de base sont également encapsulés:ObservableIntAttendez.
public final ObservableInt age = new ObservableInt();

public Human(String name,int age){
this.name.set(name);
this.age.set(age);
}

}

ActivityEtxmlL'opération est la même qu'avant,Modifier les données,Changement automatiquexmlC'est tout.:

//C'est tellement pratique
human.name.set(“Yujizi”);
human.age.set(15);

3.3、ObservableCollection

Un regard, c'est une collection,Ici et ce que nous utilisons List MapC'est pareil.C'est juste ici.ObservableList、ObservableMapC'est encapsulé..Quand on change les données de la collection.xmlÇa va changer..La seule chose à noter est,InxmlQuand il a cité ces collections<Type>,Ces symboles,Ça affectexmlFormat pour échapper à.Avec< Représentant<;Avec&gtReprésentant>(Ces échappatoires,Même soutienMark Down);Pour en savoir plus sur Baidu DataBindingCaractère d'évasion.

<layout xmlns:android=“ http://schemas.android.com/apk/res/android”>

<data>

<variable
name=“list”
type=“androidx.databinding.ObservableList<String>” />

<variable
name=“map”
type=“androidx.databinding.ObservableMap<String,String>” />

<variable
name=“index”
type=“int” />

<variable
name=“key”
type=“String” />
</data>

<LinearLayout
android:layout_width=“match_parent”
android:layout_height=“match_parent”
android:orientation=“vertical”>

<TextView
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:text=“@{list[index],default = Ha Ha!}” />

<TextView
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:text=“@{map[key],default = C'est pas vrai.}” />

</LinearLayout>
</layout>

Il y a un trou ici.,C'est à toi.default = “Par défaut” Il est préférable que cette valeur par défaut ne soit pasdataUne citation de.Sinon, il y aura une erreur.Ici, nous apportonsindex = 0 Apporter,Prends ça.key = name.Remplacer par,Et ça change dynamiquement,Dans la collection2Valeurs:

@Override
public void onClick(View v) {
int randowInt = new Random().nextInt(100);
switch (v.getId()){
case R.id.btn_index:
//ChangementlistPremier point
list.add(0,“listValeur de” + randowInt);
break;
case R.id.btn_key:
map.put(“name”,“mapValeur de” + randowInt);
break;
}
}

AndroidConstruire à partir de zéroMVVMArchitecture(1)(1),kotlinFonction anonyme_Développement mobile_02

Quatre、Liaison bidirectionnelle des données

Ça veut dire que tu as changébeanValeurs dans l'objet,Il prendra l'initiative de changerxmlAffichage de,ChangementxmlLa valeur de,Il va mettrebeanLes propriétés de l'objet ont changé. Ici, on utilise1- Oui.TextViewAfficher les données;Avec1- Oui.EditTextViewBINDbeanObjet,Réutiliser1- Oui.ButtonPeut être interrogé dynamiquementbeanValeur de l'attribut dans l'objet

<layout xmlns:android=“ http://schemas.android.com/apk/res/android”>

<data>
<variable
name=“human”
type=“com.lihang.databindinglover.bean.Human” />
</data>

<LinearLayout
android:layout_width=“match_parent”
android:layout_height=“match_parent”
android:orientation=“vertical”>

<TextView
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:text=“@{human.name}” />

<EditText
android:layout_width=“match_parent”
android:layout_height=“60dp”
android:layout_marginTop=“20dp”
android:text=“@={human.name}” />

<Button
android:id=“@+id/btn_search”
android:layout_marginTop=“60dp”
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:text=“Propriétés de requête dynamique”
/>
</LinearLayout>
</layout>

beanLiaison objetxmlAfficher:Une liaison unidirectionnelle est@{Valeur de l'attribut},La liaison bidirectionnelle est@={Valeur de l'attribut},Les effets sont les suivants:

AndroidConstruire à partir de zéroMVVMArchitecture(1)(1),kotlinFonction anonyme_Android_03

Fin

Sur la base du traitement,L'objectif ultime est le développement,Dans un endroit bien payé,Rechercher le meilleur développement!

Voici quelques - uns.AndroidLes chefs d'entreprise de l'industrie correspondent à des informations avancées compilées par les points techniques ci - dessus.Oui.** AndroidVidéo de schéma+BATJSujet de l'entrevuePDF+Notes de base, etc..J'espère pouvoir aider tout le monde à améliorer la technologie.Si tout le monde veut l'avoir,C'est bon.Croyez - moi personnellement【666】Accès gratuit**

AndroidConstruire à partir de zéroMVVMArchitecture(1)(1),kotlinFonction anonyme_Android_04

版权声明
本文为[Mb61c1dbbb44788]所创,转载请带上原文链接,感谢
https://chowdera.com/2022/01/202201150218513131.html

随机推荐