这是从片段中获取字符串资源的正确方法吗?

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 对象更新

这是获取此 HTML 字符串中唯一的 MP3 href 的正确 xpath 查询语句吗?

这是从标签获取文本并在iOS中与字符串连接的标准方法吗?

这是用熊猫中列的平均值替换字符串的正确方法吗?

获取当前可见的Android Fragment

Android - 如何显示包含从片段中获取的字符串的快餐栏