Android 中,Activity & Fragment:如何进行界面跳转、数据传递等

学习笔记

1. Activity 之间的界面跳转和数据传递

在 Android 中,Activity 之间的跳转通常通过 Intent 来完成。Intent 可以携带数据,并传递给目标 Activity,也可以从目标 Activity 返回数据。

从一个 Activity 跳转到另一个 Activity

java 复制代码
// 在第一个 Activity 中跳转到第二个 Activity
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivity(intent);

携带数据传递到另一个 Activity

通过 IntentputExtra() 方法传递数据:

java 复制代码
// 在第一个 Activity 中
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("key_name", "John Doe");  // 传递字符串数据
intent.putExtra("key_age", 25);  // 传递整型数据
startActivity(intent);

在目标 Activity 中通过 getIntent() 获取数据:

java 复制代码
// 在第二个 Activity 中获取数据
Intent intent = getIntent();
String name = intent.getStringExtra("key_name");
int age = intent.getIntExtra("key_age", 0);  // 默认值为 0

从一个 Activity 返回数据到另一个 Activity

如果你需要从目标 Activity 返回数据到原 Activity,可以使用 setResult()startActivityForResult()

原 Activity (发送数据)

java 复制代码
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivityForResult(intent, REQUEST_CODE);

目标 Activity (接收并返回数据)

java 复制代码
Intent resultIntent = new Intent();
resultIntent.putExtra("result_key", "Returned Data");
setResult(RESULT_OK, resultIntent);
finish();  // 返回原 Activity

原 Activity (接收返回数据)

java 复制代码
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
        String result = data.getStringExtra("result_key");
        // 处理返回的数据
    }
}

启动 Activity 并返回数据(Jetpack 推荐)

使用 ActivityResultContracts 是 Jetpack 推荐的新 API,取代了 startActivityForResult()

java 复制代码
// 在原 Activity 中使用 ActivityResultContracts
ActivityResultLauncher<Intent> startActivityForResult = registerForActivityResult(
        new ActivityResultContracts.StartActivityForResult(), result -> {
            if (result.getResultCode() == RESULT_OK) {
                Intent data = result.getData();
                String resultData = data.getStringExtra("result_key");
                // 处理返回的数据
            }
        });

// 发起跳转
Intent intent = new Intent(this, SecondActivity.class);
startActivityForResult.launch(intent);

2. Fragment 之间的界面跳转和数据传递

Fragment 之间的跳转和数据传递与 Activity 的类似,但通常使用 FragmentTransaction 来替代 Intent

Fragment 之间跳转

Fragment 之间的跳转需要通过 FragmentTransaction 来操作:

java 复制代码
// 在 Fragment 中跳转到另一个 Fragment
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.fragment_container, new AnotherFragment());
transaction.addToBackStack(null);  // 如果需要支持返回栈
transaction.commit();

Fragment 之间的数据传递

可以通过 Bundle 对象在 Fragment 之间传递数据:

从一个 Fragment 向另一个 Fragment 传递数据:

java 复制代码
// 在第一个 Fragment 中创建 Bundle 数据
Bundle bundle = new Bundle();
bundle.putString("key_name", "John Doe");
bundle.putInt("key_age", 25);

// 将数据传递给目标 Fragment
AnotherFragment fragment = new AnotherFragment();
fragment.setArguments(bundle);

// 使用 FragmentTransaction 跳转到目标 Fragment
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.fragment_container, fragment);
transaction.addToBackStack(null);  // 可选
transaction.commit();

在目标 Fragment 中获取传递的数据:

java 复制代码
// 在目标 Fragment 中获取数据
Bundle arguments = getArguments();
if (arguments != null) {
    String name = arguments.getString("key_name");
    int age = arguments.getInt("key_age", 0);  // 默认值为 0
}

Fragment 与 Activity 之间的数据传递

FragmentActivity 之间的数据传递也使用 Bundle,或者通过 setArguments()getArguments()

ActivityFragment 传递数据:

java 复制代码
// 在 Activity 中创建并传递数据到 Fragment
Bundle bundle = new Bundle();
bundle.putString("key_name", "John Doe");
bundle.putInt("key_age", 25);

Fragment fragment = new ExampleFragment();
fragment.setArguments(bundle);  // 设置参数

FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.fragment_container, fragment);
transaction.commit();

FragmentActivity 传递数据:

如果你需要从 FragmentActivity 返回数据,通常通过 getActivity() 获取宿主 Activity 的实例,并调用自定义的回调方法。

java 复制代码
// 在 Fragment 中
public class ExampleFragment extends Fragment {
    private OnDataPass dataPasser;

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        dataPasser = (OnDataPass) context;  // 绑定回调接口
    }

    public void passDataToActivity(String data) {
        dataPasser.onDataPass(data);  // 调用宿主 Activity 的方法
    }

    public interface OnDataPass {
        void onDataPass(String data);
    }
}

Activity 中实现回调接口:

java 复制代码
public class MainActivity extends AppCompatActivity implements ExampleFragment.OnDataPass {
    @Override
    public void onDataPass(String data) {
        // 在 Activity 中处理 Fragment 传递过来的数据
    }
}

3. 使用 ViewModel 和 LiveData 进行数据共享

在 Android 应用中,ViewModelLiveData 提供了一种非常现代化的方式来共享数据,特别是在 ActivityFragment 之间。当数据在 ViewModel 中保存时,任何观察该数据的组件都会自动获得更新,这避免了传统的数据传递方式中的繁琐代码。

通过 ViewModel 和 LiveData 共享数据

1.创建 ViewModel

java 复制代码
public class SharedViewModel extends ViewModel {
    private final MutableLiveData<String> liveData = new MutableLiveData<>();

    public LiveData<String> getLiveData() {
        return liveData;
    }

    public void setData(String data) {
        liveData.setValue(data);
    }
}

2.在 Activity 中初始化 ViewModel

java 复制代码
SharedViewModel viewModel = new ViewModelProvider(this).get(SharedViewModel.class);

3.在 Fragment 中共享 ViewModel

java 复制代码
SharedViewModel viewModel = new ViewModelProvider(getActivity()).get(SharedViewModel.class);
viewModel.getLiveData().observe(getViewLifecycleOwner(), data -> {
    // 更新 UI
});

4.在 Fragment 中设置数据

java 复制代码
viewModel.setData("New Data");

总结

  • Activity 之间跳转 :使用 Intent 进行跳转,可以通过 putExtra() 传递数据。

  • Fragment 之间跳转 :通过 FragmentTransaction 实现跳转,数据通过 Bundle 传递。

  • Activity 和 Fragment 之间传递数据Activity 使用 IntentFragment 使用 setArguments()getArguments()

  • 使用 ViewModel 和 LiveData :在现代 Android 开发中,推荐使用 ViewModelLiveData 来实现跨 ActivityFragment 的数据共享,简化数据管理和界面更新。

这些方法各有适用场景,根据实际需要选择合适的方式来进行界面跳转和数据传递。

相关推荐
LucianaiB2 分钟前
C语言之装甲车库车辆动态监控辅助记录系统
android·c语言·开发语言·低代码
limingade6 分钟前
从零搭建一套远程手机的桌面操控和文件传输的小工具
android·adb·智能手机·信息与通信·android runtime
2401_897915659 分钟前
Android Jetpack 之 Paging3的一些踩坑记录
android·android jetpack
ghostwritten40 分钟前
实战经验:使用 Python 的 PyPDF 进行 PDF 操作
android·python·pdf
2401_897915651 小时前
Android Http基础:图片下载并显示和WebView的应用
android·网络协议·http
李歘歘2 小时前
Golang——包的循环引用问题(import cycle not allowed)和匿名导入
android·数据库·golang
studyForMokey2 小时前
【Android学习】Kotlin随笔
android·学习·kotlin
gf13211114 小时前
python_在钉钉群@人员发送消息
android·python·钉钉
普通网友9 小时前
Android-Gradle-自动化多渠道打包
android·python·自动化
流星白龙10 小时前
【Linux】16.Linux进程概念(5)
android·linux·运维