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 的数据共享,简化数据管理和界面更新。

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

相关推荐
Devil枫2 小时前
Kotlin高级特性深度解析
android·开发语言·kotlin
ChinaDragonDreamer2 小时前
Kotlin:2.1.20 的新特性
android·开发语言·kotlin
雨白12 小时前
Jetpack系列(二):Lifecycle与LiveData结合,打造响应式UI
android·android jetpack
kk爱闹14 小时前
【挑战14天学完python和pytorch】- day01
android·pytorch·python
每次的天空16 小时前
Android-自定义View的实战学习总结
android·学习·kotlin·音视频
恋猫de小郭16 小时前
Flutter Widget Preview 功能已合并到 master,提前在体验毛坯的预览支持
android·flutter·ios
断剑重铸之日17 小时前
Android自定义相机开发(类似OCR扫描相机)
android
随心最为安17 小时前
Android Library Maven 发布完整流程指南
android
岁月玲珑17 小时前
【使用Android Studio调试手机app时候手机老掉线问题】
android·ide·android studio
还鮟21 小时前
CTF Web的数组巧用
android