2017-10-10 108 views
0

我無法理解MVVM究竟是什麼?這怎麼可能讓下面的代碼跟隨MVVM或不是?

它是唯一的方法來確定代碼清理器或類似設計模式,我不能理解什麼是MVVM。

我已經制定了一個簡單的教程,因爲我一直使用DataBinding。如何區分它沒有遵循MVVM?

我在這裏得到簡單的問題,希望我會得到明確的答案與示例。

MainActivity

public class MainActivity extends AppCompatActivity { 


    ActivityMainBinding activityMainBinding; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     activityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main); 

     User user = new User("Android", "ios", "Blackberry"); 
     activityMainBinding.setVariable(user); 



    } 
} 

模態類

public class Client { 
    String name; 


public Client(String name) { 
    this.name = name; 
} 

public String getName() { 
    return name; 
} 
} 

佈局

<data> 

    <variable 
     name="variable" 
     type="com.example.user_pc.databinding.User" /> 

</data> 

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <TextView 
     android:id="@+id/firstName" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:paddingBottom="30dp" 
     android:text="@{variable.firstName}" 

     /> 

    <TextView 
     android:id="@+id/middleName" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:paddingBottom="30dp" 
     android:text="@{variable.middleName}" /> 

    <TextView 
     android:id="@+id/lastName" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:paddingBottom="30dp" 
     android:text="@{variable.lastName}" /> 


</LinearLayout> 

這似乎是簡單的問題,但我正在努力理解 MVVM和它的工作flow.All正在不同的目錄中的模型,視圖和視圖模型,它是隻讓direcotry的不同還是什麼?我沒有清楚的概念。

回答

1

不,這不是包裝。架構對於抽象是至關重要的。 MVVM或MVP(兩者都不相同)有助於抽象業務層和視圖層。

我不會在這裏詳細說明,你可以閱讀博客。

當你使用observables,比如在數據綁定,LiveData或RX observables中時,MVVM是最有用的。您只需更改viewModel中的值,並且更改將反映在UI中。您不必一次又一次地使用 textView.setText()

好了,讓我們打破(讓我們保持簡單的事情)

查看包括活動,碎片等

視圖模型負責包裝的型號和準備需要觀察數據由視圖。它還爲視圖提供了將事件傳遞給模型的鉤子。然而,ViewModel並不依賴於視圖。它包含一個接口ViewModel和與不同活動關聯的不同ViewModel。這是一個鏈接到Android ViewModel

模型保存應用程序的數據和狀態。

您可以在任何地方找到這些說明。最重要的部分是爲什麼我們應該使用這些架構?

比方說你有一個應用程序,在那裏你必須計算值的總和在兩個文本字段提供,TEXTATEXTB到另一個文本字段textC

你需要一個Model類總和存儲數據並顯示或保存。

public class Sum{ 
public int num1,num2,sum;// make these observable. 
} 

讓我們假設這是一個棘手的問題,你會喜歡在第一次對你的業務邏輯只專注,併成功地實現邏輯之後,你會移動到改變你的看法。

所以,你寫你的ViewModel類

public class SumViewModel extends ViewModel{ 
// implement other required methods and variables, if possible LiveData. 
// either you can use Databinding Observable, and share the same Sum object in 
// View and ViewModel or you can use LiveData as shown in the link. 
Sum s; 
public void onSumPressed(int a, int b){ 
s.num1 = a; 
s.num2 = b; 
s.sum = a+b; 
} 
public void clearPressed(){ 
s.num1=0; 
s.num2=0; 
s.sum=0; 
} 
} 

所以,您已成功實現的業務邏輯。唷!現在,您可以專注於您的觀點了

public class SumActivity extends AppcompatActivity{ 
    Sum s;// as discussed, you can make this observable. 
private SumViewModel model; 
private ActivitySumBinding binding; 
onCreate(){ 
... 
model = ViewModelProviders.of(this).get(SumViewModel.class); 
int a = Integer.parseInt(binding.text1.getText().toString()); 
int b = Integer.parseInt(binding.text2.getText().toString()); 
binding.sumBtn.setOnclickListener(v-> model.onSumPressed(a,b)); 
//Now, since the object s is being obseverd, data will be changed in the view accordingly. 
... 
} 

} 

該程序僅用於演示。

我希望您注意主要議題。我們打破了我們的目標並一次專注於一個目標。我們首先實現我們的業務邏輯,然後繼續進行適當的視圖更改。而且調整新的需求非常容易,因爲你只需要繼續添加方法。

關於MVVM的另一個優點是我們的View Model現在非常容易進行單元測試。

+0

我在這裏得到了一些澄清,我會挖掘full.is MVVM比MVP更好? – Ghimire