requireActivity() 和 getActivity() 都是从 Fragment 中获取宿主 Activity 的方法,但它们有一些不同的行为和使用场景。
requireActivity()
-
抛出异常:如果
Fragment没有附加到任何Activity,调用requireActivity()会抛出IllegalStateException。 -
安全性:通常在你确定
Fragment已经附加到Activity时使用,可以避免NullPointerException。
getActivity()
-
返回null:如果
Fragment没有附加到任何Activity,调用getActivity()会返回null。 -
需要检查null:需要检查返回值是否为
null,否则可能会导致NullPointerException。
选择哪一个?
-
推荐使用
requireActivity():因为它更具安全性,强制你处理Fragment未附加到Activity的情况。 -
getActivity()的使用场景:如果你需要处理Fragment未附加到Activity的情况,可以使用getActivity()并进行null检查。
在具体代码中,如果你确信在调用时 Fragment 已经附加到 Activity,可以使用 requireActivity(),否则使用 getActivity() 并进行 null 检查。
import android.content.Intent;
import android.provider.Settings;
import android.widget.Toast;
import androidx.fragment.app.Fragment;
public class MyFragment extends Fragment {
private void openWifiSettings() {
try {
Intent intent = new Intent(Settings.ACTION_WIFI_SETTINGS);
if (intent.resolveActivity(requireActivity().getPackageManager()) != null) {
startActivity(intent);
} else {
Toast.makeText(requireContext(), "无法打开Wi-Fi设置", Toast.LENGTH_SHORT).show();
}
} catch (Exception e) {
Toast.makeText(requireContext(), "无法打开Wi-Fi设置", Toast.LENGTH_SHORT).show();
e.printStackTrace();
}
}
}
import android.content.Intent;
import android.provider.Settings;
import android.widget.Toast;
import androidx.fragment.app.Fragment;
public class MyFragment extends Fragment {
private void openWifiSettings() {
try {
Intent intent = new Intent(Settings.ACTION_WIFI_SETTINGS);
if (getActivity() != null && intent.resolveActivity(getActivity().getPackageManager()) != null) {
startActivity(intent);
} else {
Toast.makeText(requireContext(), "无法打开Wi-Fi设置", Toast.LENGTH_SHORT).show();
}
} catch (Exception e) {
Toast.makeText(requireContext(), "无法打开Wi-Fi设置", Toast.LENGTH_SHORT).show();
e.printStackTrace();
}
}
}
总结
- 使用
requireActivity()可以避免NullPointerException,但需要确保Fragment已经附加到Activity。 - 使用
getActivity()更加灵活,但需要进行null检查,以确保Activity存在。
根据具体情况选择合适的方法,以确保代码的健壮性和稳定性。