编程知识 cdmana.com

Android construit l'architecture mvvm à partir de zéro

@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'abord 2Caté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ême xml Ça doit être utilisé plusieurs fois UserQuand,type Le 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à 2 Les classes avec différents paquets du même nom sont nécessaires aliasAlias, 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>

Activity Tout 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 es ActivityTiens.userSet tonull.Et ne s'effondrera pas.

2.、DataBindingInFragmentEtRecyclerViewUtilisation de

InFragmentUtilisation etActivity Il 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 sur recyclerViewUtilisation de. Est - ce qu'on écrivait ViewHolder J'en ai marre d'écrire ?Ça marche.DataBindingAprès, Je vais te dire ViewHolder Pour faire tout ce qu'il faut ViewHolder

Regardez d'abord notre seul ViewHolder. Tout d'abord ,Généré automatiquementBindingLes parents deViewDataBinding.C'est moi.ViewHolder Il 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;
}
}

InAdapter Tout 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 instansof Un bon jugement .Comme ça.ViewHolder Il 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 automatiquement xmlAffichage 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éfinissons DogCatégorie

public class Dog extends BaseObservable {

//Si ouipublicDécoré,Utilisation [email protected]
@Bindable
public String name;
//Si ouiprivateDécoré,DansgetUtilisation de la mé[email protected]
private String color;

public void setDataOnlyName(String name, String color) {
this.name = name;
this.color = color;
// Brosse seulement nameChamp
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

  • bean L'objet doit hériter BaseObservable
  • @Bindable Indique quel champ nécessite une liaison unidirectionnelle .public Les modificateurs peuvent être utilisés directement @BindableBIND.private Le besoin de retouches est get() 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 fin demoRegarde.:Liaison unidirectionnelle des données – BaseObservable.

AndroidConstruire à partir de zéroMVVMArchitecture(1),Lancement à l'échelle du réseau_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 derniers HumanCaté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);
}

}

ActivityEtxml L'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,Inxml Quand il a cité ces collections <Type>,Ces symboles,Ça affectexml Format 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 pas dataUne citation de.Sinon, il y aura une erreur. Ici, nous apportons index = 0 Apporter,Prends ça.key = name.Remplacer par, Et ça change dynamiquement , Dans la collection 2Valeurs:

@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),Lancement à l'échelle du réseau_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 changer xmlAffichage de,Changementxml La valeur de ,Il va mettrebean Les 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é dynamiquementbean Valeur 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),Lancement à l'échelle du réseau_Programmeur_03

Cinq、Ininclude Et viewStubUtilisé dans

5.1 InincludeUtilisé dans.

includeLa disposition du:

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

<data>

<variable
name=“user”
type=“com.lihang.databindinglover.bean.User” />

</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=“@{user.name}” />

</LinearLayout>
</layout>

ActivityCitationincludeVoilà.:

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

<data>

<variable
name=“user”
type=“com.lihang.databindinglover.bean.User” />

</data>

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

<include
layout=“@layout/include_item”
app:user=“@{user}” />

</RelativeLayout>
</layout>

Attention!:app:user=“@{user}”.Le premieruser- Oui.include- Oui.nameRéférences.DeuxièmementuserEst la valeur actuellement passée.

5.2、viewStubUtilisation dans

Brève IntroductionviewStub:ParviewStubEnveloppé. Même si la page est affichée , La disposition enveloppée ne sera pas non plus chargée ,À moins d'appelerinflate. C'est une optimisation de la mise en page du carton .include Est l'optimisation de la disposition dans le Code .

Mettez - le directement.ActivityLa disposition.. La disposition enveloppée et includeC'est pareil

Enfin

En résumé,Le succès est réservé à ceux qui sont prêts.Peu importe l'entrevue,Soyez bien préparés.,Faites attention à l'étiquette et à la tenue de l'entrevue,Il est bon de montrer votre enthousiasme et votre sincérité à l'intervieweur.Même si ça n'a pas marché.,Faites également un bon résumé de l'expérience,Préparez - vous bien pour la prochaine entrevue.

Ici, j'ai préparé pour tout le monde quelques documents d'entrevue que j'ai compilés après l'entrevue,En plus des questions d'entrevue,Il résume également les entreprises InternetAndroidLa plupart des questions d'entrevue et des réponses à l'entrevue du programmeur,Et l'a documenté,Et la vidéo d'apprentissage avancé du système,Partager gratuitement,J'espère que cela vous aidera à revoir votre entrevue avant,Et trouver un bon travail,Vous économisez également du temps en recherchant des documents en ligne pour apprendre.

Après tout, quel que soit le type d'intervieweur rencontré,Aller à l'entrevue d'abord et avant tout est leur force,Tant que c'est dur.,Assez technique.,Je n'ai pas peur de ne pas avoir d'interview.offer!

Tu veux un entretien?,Obtenez les données d'entrevue ci - dessous et préparez - vous pour l'entrevue suivante!Je vous souhaite à l'avance un entretien réussi!

Méthode de collecte des données:?? AndroidConception architecturale

AndroidConstruire à partir de zéroMVVMArchitecture(1),Lancement à l'échelle du réseau_Développement mobile_04

AndroidConstruire à partir de zéroMVVMArchitecture(1),Lancement à l'échelle du réseau_Android_05

Pourquoi certaines personnes sont toujours meilleures que toi?,C'est parce qu'il est bon en lui - même et qu'il continue d'essayer d'être meilleur.,Et est - ce que tu te contentes de ce qui se passe?!J'espère que vous lirez ceci pour un petit compliment et l'attention que je,La technologie sera mise à jour plus tard,Merci pour votre soutien!

AndroidConstruire à partir de zéroMVVMArchitecture(1),Lancement à l'échelle du réseau_Programmeur_06

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

Scroll to Top