2017-01-28 54 views
1

讓我首先與表示碼開始:的Android數據綁定:視圖不更新時proparty改變

的build.gradle(模塊):

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" /> 

MainActicity.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 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
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; 
} 

enter image description here

我試着做簡單的數據綁定,但proparty正在發生變化後,我的看法沒有更新。 ,你可以在圖片中看到,我的代碼抵達:

  notifyPropertyChanged(com.example.oryaa.basecalculator.BR.calcResult); 

但是當應用程序啓動的視圖只更新或當我轉動我的手機垂直到水平,反之亦然。

我的問題在哪裏?

非常感謝, 或者雅各布·

+0

When a variable or observable changes, the binding will be scheduled to change before the next frame. There are times, however, when binding must be executed immediately. To force execution, use the executePendingBindings() method.

Advanced Binding章從MainActivity刪除此行() 「setContentView(R.layout.activity_main);」 再試一次 – GvSharma

+0

不,還是不行 –

+0

試着將字段設置爲私有。它可能更喜歡通過訪問器方法訪問字段。 –

回答

1

你需要調用executePendingBindings()用於立即查看更新綁定值:獲取更多信息

相關問題