📜  Android 中的 Jetpack LiveData 示例

📅  最后修改于: 2022-05-13 01:55:13.946000             🧑  作者: Mango

Android 中的 Jetpack LiveData 示例

Android Jetpack 是一套库,可帮助开发人员遵循最佳实践、减少样板代码并编写跨 Android 版本和设备一致运行的代码,以便开发人员可以专注于他们关心的代码。在这里,我们将在 Android Studio 中实现 Jetpack Live Data。

我们将在本文中构建什么?

下面显示了我们将在本文中构建的示例视频。请注意,我们将用Java语言实现这个项目。

分步实施

步骤 1. 创建一个新项目

  • 打开一个新项目。
  • 我们将使用Java语言开发 Empty Activity。保持所有其他选项不变。
  • 在您方便的时候命名应用程序。
  • 将有两个名为 activity_main.xml 和 MainActivity 的默认文件。Java

如果您不知道如何在 Android Studio 中创建新项目,可以参考如何在 Android Studio 中创建/启动新项目?

步骤 2. 添加所需的依赖项

导航到 Gradle scripts > build.gradle(module) 并在其中使用以下依赖项-

implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'

步骤 3. 处理 XML 文件

导航到 app > res > layout > activity_main.xml 并将以下代码添加到该文件。下面是activity_main.xml文件的代码。

XML


 
    
   
    
 


XML


 
   
 


Java
package com.example.jetpacklivedata;
 
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModelProvider;
import androidx.lifecycle.ViewModelProviders;
 
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.widget.EditText;
 
public class MainActivity extends AppCompatActivity {
 
    // Initialize variables
    EditText editText;
    MainViewModel mainViewModel;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        // Assign variables
        editText=findViewById(R.id.et_text);
 
        // Initialize view model
        mainViewModel= ViewModelProviders.of(MainActivity.this)
                .get(MainViewModel.class);
 
        editText.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
 
            }
 
            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                // When text change
                // Update view model text
                mainViewModel.setText(String.valueOf(charSequence));
            }
 
            @Override
            public void afterTextChanged(Editable editable) {
 
            }
        });
 
        // Initialize fragment
        Fragment fragment=new MainFragment();
         
        // Open Fragment
        getSupportFragmentManager().beginTransaction().replace(R.id.frame_layout,fragment).commit();
    }
}


Java
package com.example.jetpacklivedata;
 
import android.os.Bundle;
 
import androidx.fragment.app.Fragment;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProviders;
 
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
 
 
public class MainFragment extends Fragment {
 
    // Initialize variable
    TextView tvResult;
    MainViewModel mainViewModel;
 
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Initialize view
        View view=inflater.inflate(R.layout.fragment_main, container, false);
 
        // Assign variable
        tvResult=view.findViewById(R.id.tv_result);
 
        // Check condition
        if(getActivity()!=null){
            // When activity is not null
            // Initialize view model
            mainViewModel= ViewModelProviders.of(getActivity())
                    .get(MainViewModel.class);
 
            // Set observer on get text method
            mainViewModel.getText().observe(getActivity(), new Observer() {
                @Override
                public void onChanged(String s) {
                    // When text change
                    // set result text on text view
                    tvResult.setText(s);
                }
            });
        }
 
        // return view
        return view;
    }
}


Java
package com.example.jetpacklivedata;
 
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;
 
public class MainViewModel extends ViewModel {
 
    // Initialize variable
    MutableLiveData mutableLiveData
        = new MutableLiveData<>();
 
    // Create set text method
    public void setText(String s)
    {
        // Set value
        mutableLiveData.setValue(s);
    }
 
    // Create get text method
    public MutableLiveData getText()
    {
        // return value
        return mutableLiveData;
    }
}



导航到应用程序 > 右键单击 > 新建 > 片段 > 空白片段。将其命名为 MainFragment 并在fragment_main.xml文件中使用以下代码 -

XML



 
   
 


第 4 步:处理Java文件

导航到MainActivity。 Java文件并在其中使用以下代码。代码中添加了注释以便更好地理解。

Java

package com.example.jetpacklivedata;
 
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModelProvider;
import androidx.lifecycle.ViewModelProviders;
 
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.widget.EditText;
 
public class MainActivity extends AppCompatActivity {
 
    // Initialize variables
    EditText editText;
    MainViewModel mainViewModel;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        // Assign variables
        editText=findViewById(R.id.et_text);
 
        // Initialize view model
        mainViewModel= ViewModelProviders.of(MainActivity.this)
                .get(MainViewModel.class);
 
        editText.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
 
            }
 
            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                // When text change
                // Update view model text
                mainViewModel.setText(String.valueOf(charSequence));
            }
 
            @Override
            public void afterTextChanged(Editable editable) {
 
            }
        });
 
        // Initialize fragment
        Fragment fragment=new MainFragment();
         
        // Open Fragment
        getSupportFragmentManager().beginTransaction().replace(R.id.frame_layout,fragment).commit();
    }
}


导航到MainFragment。 Java文件并在其中使用以下代码。代码中添加了注释以便更好地理解。

Java

package com.example.jetpacklivedata;
 
import android.os.Bundle;
 
import androidx.fragment.app.Fragment;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProviders;
 
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
 
 
public class MainFragment extends Fragment {
 
    // Initialize variable
    TextView tvResult;
    MainViewModel mainViewModel;
 
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Initialize view
        View view=inflater.inflate(R.layout.fragment_main, container, false);
 
        // Assign variable
        tvResult=view.findViewById(R.id.tv_result);
 
        // Check condition
        if(getActivity()!=null){
            // When activity is not null
            // Initialize view model
            mainViewModel= ViewModelProviders.of(getActivity())
                    .get(MainViewModel.class);
 
            // Set observer on get text method
            mainViewModel.getText().observe(getActivity(), new Observer() {
                @Override
                public void onChanged(String s) {
                    // When text change
                    // set result text on text view
                    tvResult.setText(s);
                }
            });
        }
 
        // return view
        return view;
    }
}


导航到应用 > 新建 > Java类。将其命名为 MainViewModel 并在 MainViewModel 中使用以下代码。 Java文件。

Java

package com.example.jetpacklivedata;
 
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;
 
public class MainViewModel extends ViewModel {
 
    // Initialize variable
    MutableLiveData mutableLiveData
        = new MutableLiveData<>();
 
    // Create set text method
    public void setText(String s)
    {
        // Set value
        mutableLiveData.setValue(s);
    }
 
    // Create get text method
    public MutableLiveData getText()
    {
        // return value
        return mutableLiveData;
    }
}


这是我们应用程序的最终输出。

输出: