【Android】Jetpack中的ViewModel:自動保存頁面數據


ViewModel

簡介

  ViewModel 允許數據在配置更改(如屏幕旋轉)后仍然存在,使用 ViewModel 可以免去開發者花費大量時間精力處理Activity生命周期變化導致的數據刷新重建后的恢復問題。
  我們使用創建工程時,系統自動為我們添加的Text組件作為示范。

ViewModel的使用方法

Step 1:創建ViewModel類

  在當前工程文件app -> java -> com.example.name層級上,右鍵new,選擇java class。輸入類名稱,在super class一欄填寫 androidx.lifecycle.ViewModel,點擊OK完成創建。
  如圖:
![在這里插入圖片描述](https://img-blog.csdnimg.cn/20190726142644852.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L29nbmFN,size_16,color_FFFFFF,t_70#pic_center =400x330)

Step 2:編寫ViewModel類內容(包括變量、方法等)

  接下來在ViewModel類中,實現對組件UI數據的控制。我們設置一個number變量作為Text組件的值。設置ClickText方法在用戶點擊Text組件的時候,實現其數值加一。

/* ViewModelTest 中的內容 */
package com.hello.livedata;
import androidx.lifecycle.ViewModel;

public class ViewModelTest extends ViewModel {
    private int number=0;

    /* getNumber方法返回private變量number的值 */
    public int getNumber() {
        return number;
    }
    /* getNumber方法返回private變量number+1的值 */
    public int numberPlus() {
        number++;
        return number;
    }
}

Step 3:在Activity中進行ViewModel綁定,以及控制

  在此之前,需要進入activity_main.xml 界面,單擊design頁面的hello world的Textview,為其設置ID。如圖:
![在這里插入圖片描述](https://img-blog.csdnimg.cn/20190726144826336.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L29nbmFN,size_16,color_FFFFFF,t_70#pic_center =400x180)
  設置完TextView組件的ID值后,就可以通過MainActivity.java文件綁定ViewModel並進行控制。

package com.hello.livedata;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.ViewModelProvider;
import androidx.lifecycle.ViewModelProviders;  /* 引入ViewModelProviders類,並單擊紅色部分文字后
                                                  點擊左邊出現的紅色小燈泡選擇引入依賴 */

public class MainActivity extends AppCompatActivity {
    ViewModelTest myViewModel; /* 新建ViewModel的實例*/
    TextView textView;          /* 新建textView實例*/

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
      	  /* 在onCreate中,將myViewModel與class綁定 */
        myViewModel = ViewModelProviders.of(this).get(ViewModelTest.class);
      	  /* 將textView實例通過ID與activity_main.xml中的組件綁定 */
        textView = findViewById(R.id.textview01);
     	  /* 當Activity的生命周期改變,如因屏幕旋轉而導致的重建時,直接讀取ViewModel中的數據傳送給組件*/
        textView.setText(String.valueOf(myViewModel.getNumber()));
       	  /* 為textView設置監聽器,當單擊時,觸發ViewModel中的方法改變TextView值 */
        textView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                textView.setText(String.valueOf(myViewModel.numberPlus()));
            }
        });
    }
}

Step 4:運行

  使用Shift+F10在模擬器中運行程序,得到設想的結果。如下圖所示,即使屏幕旋轉,數據依舊可以通過ViewModel非常便捷地恢復。

![在這里插入圖片描述](https://img-blog.csdnimg.cn/20190726151019926.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L29nbmFN,size_16,color_FFFFFF,t_70#pic_center =400x)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM