lassen Sie mich zunächst den Code anzeigen:
build.gradle (Modul):
Android {
compileSdkVersion 24
buildToolsVersion "24.0.2"
dataBinding {
enabled = true
}
defaultConfig {
applicationId "com.example.oryaa.basecalculator"
minSdkVersion 15
targetSdkVersion 24
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.Android.support:appcompat-v7:24.2.1'
compile 'com.google.Android.gms:play-services-appindexing:8.1.0'
activity_main.xml:
<data>
<import type="Android.view.View" />
<variable
name="baseCalcModel"
type="com.example.oryaa.basecalculator.BaseCalcModel">
</variable>
</data> <TextView
Android:id="@+id/resultOutput"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_below="@id/resultTextView"
Android:textColor="@color/DarkBlue"
Android:text="@{baseCalcModel.calcResult}"
Android:textSize="32dp" />
HauptAktizität.Java:
public class MainActivity extends AppCompatActivity {
EditText userInput = null;
TextView resultTV = null;
Spinner fromBaseSpinner = null;
Spinner toBaseSpinner = null;
ArrayList<String> spinnerArray = new ArrayList<>();
String _allowedChars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
String _onlyOnceChar = "-+*/";
BaseCalcModel baseCalcModel = new BaseCalcModel();
/**
* ATTENTION: This was auto-generated to implement the App Indexing API.
* See https://g.co/AppIndexing/AndroidStudio for more information.
*/
private GoogleApiClient client;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
binding.setBaseCalcModel(this.baseCalcModel);
this.resultTV = (TextView) this.findViewById(R.id.resultOutput);
this.fromBaseSpinner = (Spinner) findViewById(R.id.fromBaseSpinner);
this.toBaseSpinner = (Spinner) findViewById(R.id.toBaseSpinner);
this.userInput = (EditText) findViewById(R.id.userInput);
SetupUI();
baseCalcModel.setCalcResult("test");
// ATTENTION: This was auto-generated to implement the App Indexing API.
// See https://g.co/AppIndexing/AndroidStudio for more information.
client = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build();
}
BaseCalcModel.Java:
ublic class BaseCalcModel extends BaseObservable {
public String calcResult;
public BaseView firstNumView;
public BaseView secondNumView;
public BaseView resultNumView;
public int firstNumBase;
public int secondNumBase;
public int resultNumBase;
public String error;
@Bindable
String getCalcResult() {
return calcResult;
}
@Bindable
public BaseView getFirstNumView() {
return firstNumView;
}
@Bindable
public BaseView getSecondNumView() {
return secondNumView;
}
@Bindable
public BaseView getResultNumView() {
return this.resultNumView;
}
@Bindable
public int getFirstNumBase() {
return this.firstNumBase;
}
@Bindable
public int getSecondNumBase() {
return this.secondNumBase;
}
@Bindable
public int getResultNumBase() {
return this.resultNumBase;
}
@Bindable
public String getError() {
return this.error;
}
public void setCalcResult(String calcResult) {
this.calcResult = calcResult;
notifyPropertyChanged(com.example.oryaa.basecalculator.BR.calcResult);
}
public void setFirstNumView(BaseView firstNumView) {
this.firstNumView = firstNumView;
notifyPropertyChanged(com.example.oryaa.basecalculator.BR.firstNumView);
}
public void setSecondNumView(BaseView secondNumView) {
this.secondNumView = secondNumView;
notifyPropertyChanged(com.example.oryaa.basecalculator.BR.secondNumView);
}
public void setResultNumView(BaseView resultNumView) {
this.resultNumView = resultNumView;
notifyPropertyChanged(com.example.oryaa.basecalculator.BR.resultNumView);
}
public void setFirstNumBase(int firstNumBase) {
this.firstNumBase = firstNumBase;
notifyPropertyChanged(com.example.oryaa.basecalculator.BR.firstNumBase);
}
public void setSecondNumBase(int secondNumBase) {
this.secondNumBase = secondNumBase;
notifyPropertyChanged(com.example.oryaa.basecalculator.BR.secondNumBase);
}
public void setResultNumBase(int resultNumBase) {
this.resultNumBase = resultNumBase;
notifyPropertyChanged(com.example.oryaa.basecalculator.BR.resultNumBase);
}
public void setError(String error) {
this.error = error;
notifyPropertyChanged(com.example.oryaa.basecalculator.BR.error);
}
public BaseCalcModel() {
firstNumView = new BaseView();
secondNumView = new BaseView();
resultNumView = new BaseView();
firstNumBase = 0;
secondNumBase = 0;
resultNumBase = 0;
calcResult = "";
error = "";
}
public BaseCalcModel(BaseView firstNumView, BaseView secondNumView, BaseView resultNumView,
int firstNumBase, int secondNumBase, int resultNumBase, String clcResult,
String error) {
this.firstNumView = firstNumView;
this.secondNumView = secondNumView;
this.resultNumView = resultNumView;
this.firstNumBase = firstNumBase;
this.secondNumBase = secondNumBase;
this.resultNumBase = resultNumBase;
this.calcResult = clcResult;
this.error = error;
}
Ich versuche, eine einfache Datenbindung vorzunehmen, aber meine Ansicht wird nicht aktualisiert, nachdem sich die Eigenschaft geändert hat. Wie Sie im Bild sehen können, ist mein Code eingegangen bei:
notifyPropertyChanged(com.example.oryaa.basecalculator.BR.calcResult);
die Ansicht wird jedoch nur aktualisiert, wenn die App gestartet wird oder wenn ich mein Telefon von vertikal nach horizontal oder umgekehrt drehe.
Wo ist mein problem
Vielen Dank. Oder Yaacov
Sie müssen executePendingBindings()
aufrufen, um den Bindungswert in der Ansicht sofort zu aktualisieren:
Wenn sich eine Variable oder ein Observable ändert, wird die Bindung vor dem nächsten Frame geplant. Es gibt jedoch Zeiten, in denen die Bindung sofort ausgeführt werden muss. Um die Ausführung zu erzwingen, verwenden Sie die Methode executePendingBindings ().
Siehe Advanced Binding Kapitel für weitere Informationen
Ich hatte ein ähnliches Problem, als ich die Ansichten nach einem Ereignis auffrischen musste, wobei meine variablen Objekte nicht beobachtbar waren. Daher fügte ich Folgendes hinzu:
binding?.invalidateAll()
Ich hoffe, es hilft.
getCalcResult()
sollte öffentlich sein.BaseView
sollte BaseObservable
erweitert werden@Bindable
erstellen. Sie können das entfernen. Und auch notifyPropertyChanged()
entfernen. Wenn Sie Modellwerte dynamisch ändern möchten, verwenden Sie das @Bindable
-Attribut.Du bist startklar.
public class BaseCalcModel extends BaseObservable {
private String calcResult;
private BaseView firstNumView;
private BaseView secondNumView;
private BaseView resultNumView;
private int firstNumBase;
private int secondNumBase;
private int resultNumBase;
private String error;
public String getCalcResult() {
return calcResult;
}
public void setCalcResult(String calcResult) {
this.calcResult = calcResult;
}
public BaseView getFirstNumView() {
return firstNumView;
}
public void setFirstNumView(BaseView firstNumView) {
this.firstNumView = firstNumView;
}
public BaseView getSecondNumView() {
return secondNumView;
}
public void setSecondNumView(BaseView secondNumView) {
this.secondNumView = secondNumView;
}
public BaseView getResultNumView() {
return resultNumView;
}
public void setResultNumView(BaseView resultNumView) {
this.resultNumView = resultNumView;
}
public int getFirstNumBase() {
return firstNumBase;
}
public void setFirstNumBase(int firstNumBase) {
this.firstNumBase = firstNumBase;
}
public int getSecondNumBase() {
return secondNumBase;
}
public void setSecondNumBase(int secondNumBase) {
this.secondNumBase = secondNumBase;
}
public int getResultNumBase() {
return resultNumBase;
}
public void setResultNumBase(int resultNumBase) {
this.resultNumBase = resultNumBase;
}
public String getError() {
return error;
}
public void setError(String error) {
this.error = error;
}
}
Falls Sie dieses Problem mit LiveData
haben, haben Sie möglicherweise vergessen, binding.setLifecycleOwner(lifecycleOwner)
hinzuzufügen.