这是从片段中获取字符串资源的正确方法吗?
Posted
技术标签:
【中文标题】这是从片段中获取字符串资源的正确方法吗?【英文标题】:Is this the right way to get string resources from within a Fragment? 【发布时间】:2017-12-10 14:11:55 【问题描述】:在片段中读取字符串资源时,哪种方法通常更好/更安全?
这里我直接读到getResources().getString()
:
public class SomeFragment extends Fragment
public static SomeFragment newInstance()
Bundle args = new Bundle();
SomeFragment fragment = new SomeFragment();
fragment.setArguments(args);
return fragment;
@Override
public void onCreate(@Nullable Bundle savedInstanceState)
super.onCreate(savedInstanceState);
String someString = getResources().getString(R.string.my_string_id);
或者这样做更好,首先设置一个上下文字段,然后从中读取资源:
public class SomeFragment extends Fragment
private Context context;
public static SomeFragment newInstance()
Bundle args = new Bundle();
SomeFragment fragment = new SomeFragment();
fragment.setArguments(args);
return fragment;
@Override
public void onAttach(Context context)
super.onAttach(context);
this.context = context;
@Override
public void onCreate(@Nullable Bundle savedInstanceState)
super.onCreate(savedInstanceState);
String someString = context.getResources().getString(R.string.my_string_id);
这两种方法有什么权衡/缺点吗?
我问的原因是因为有时我在使用第一种方法时遇到了空指针问题,而使用第二种方法解决了这些问题;所以我不确定使用第一个是否有问题。
【问题讨论】:
【参考方案1】:第二种方法更复杂,与第一种方法相比没有任何价值。使用第一种方法。
【讨论】:
我问的原因是因为有时我在使用第一种方法时遇到了空指针问题,而使用第二种方法解决了这些问题;所以我不确定使用第一个是否有问题。 @KaliMa:如果您遇到NullPointerException
请求资源,您的问题是您在不适当的时间请求资源,此时片段未附加到活动。您的解决方法(如果它改变了这种行为)会导致内存泄漏,因为您在不应该再这样做的时候坚持使用以前的 Context
。
在 onCreate / onCreateView 方法期间调用通常安全吗?
@KaliMa:如果你的意思是在这些方法中直接,是的。但是,如果您从这些方法中派生出一个线程,并且您试图访问该线程中的资源(或与托管活动相关的任何其他内容),您可能会遇到此类问题。
持有对具有暴露的 Context getter(即应用程序上下文)的应用程序对象的引用怎么样?在 Fragment 的 onCreate()
中通过 myApp = (MyApplication) getActivity().getApplication();
之类的东西初始化【参考方案2】:
这两种方法都更好。这方面没有问题。你遇到了空指针异常,因为。
当片段事务发生时,片段的生命周期开始,并且只有当它附加到活动并且到达 onstart 时,它才会准备好。
如果我们尝试在 fragmentManager 提交后立即访问该片段的公共方法。然后在访问上下文对象时会遇到空指针异常。因为它还没有完成这个过程。
所以它的开发人员逻辑编写代码理解生命周期来避免那些。
【讨论】:
【参考方案3】:Fragments 为 onCreate() 方法时,已经有了 Activity 的上下文,所以不需要事先设置上下文。除非您需要对 Context 进行特定(和不寻常的)实现,例如将变量/值从纵向屏幕模式解析为横向模式,我猜...
但是,您从最后一个上下文中获得了一个字符串资源,它已经设置好了,解析的变量/值确实如此。
【讨论】:
以上是关于这是从片段中获取字符串资源的正确方法吗?的主要内容,如果未能解决你的问题,请参考以下文章
片段 TextView 无法从 parcelable 对象更新