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
存在。
根据具体情况选择合适的方法,以确保代码的健壮性和稳定性。