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

时间:2017-07-06 14:01:21

标签: android string android-fragments android-resources android-context

在片段中读取字符串资源时,哪种方法通常更好/更安全?

我在这里直接阅读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);
    }

}

或者这样做更好,首先设置一个Context字段,然后从中读取资源:

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);
    }

}

这些方法中的任何一种都有任何权衡/弊端吗?

我问的原因是因为有时我遇到了使用第二种方法解决的第一种方法的nullpointer问题;所以我不确定使用第一个是否有问题。

3 个答案:

答案 0 :(得分:1)

第二种方法更复杂,并没有增加第一种方法的价值。使用第一种方法。

答案 1 :(得分:0)

两种方法都更好。没问题。您遇到了空指针异常,因为。

当片段事务发生时,片段的生命周期开始,并且只有当它附加到活动时,当它到达onstart时才会准备好。

有些时候,如果我们在fragmentManager的提交后立即尝试访问片段的公共方法。然后,您将在访问上下文对象时遇到空指针异常。因为它还没有完成这个过程。

所以它的开发人员逻辑编写代码来理解生命周期以避免那些。

答案 2 :(得分:0)

当Fragments是onCreate()方法时,它已经具有Activity的上下文,因此不必先设置上下文。除非您需要执行Context的特定(和inusual)实现,例如从纵向屏幕模式解析变量/值到横向模式,我猜...

但是你从最后一个上下文得到一个字符串资源,已经设置了,所以解析后的变量/值确实很好。