【问题标题】: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);
    }

}

这两种方法有什么权衡/缺点吗?

我问的原因是因为有时我在使用第一种方法时遇到了空指针问题,而使用第二种方法解决了这些问题;所以我不确定使用第一个是否有问题。

【问题讨论】:

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


    【解决方案1】:

    第二种方法更复杂,与第一种方法相比没有任何价值。使用第一种方法。

    【讨论】:

    • 我问的原因是因为有时我在使用第一种方法时遇到了空指针问题,而使用第二种方法解决了这些问题;所以我不确定使用第一个是否有问题。
    • @KaliMa:如果您遇到NullPointerException 请求资源,您的问题是您在不适当的时间请求资源,此时片段未附加到活动。您的解决方法(如果它改变了这种行为)会导致内存泄漏,因为您在不应该再这样做的时候坚持使用以前的 Context
    • 在 onCreate / onCreateView 方法期间调用通常安全吗?
    • @KaliMa:如果你的意思是在这些方法中直接,是的。但是,如果您从这些方法中派生出一个线程,并且您试图访问该线程中的资源(或与托管活动相关的任何其他内容),您可能会遇到此类问题。
    • 持有对具有暴露的 Context getter(即应用程序上下文)的应用程序对象的引用怎么样?在 Fragment 的 onCreate() 中通过 myApp = (MyApplication) getActivity().getApplication(); 之类的东西初始化
    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

      Fragments 为 onCreate() 方法时,已经有了 Activity 的上下文,所以不需要事先设置上下文。除非您需要对 Context 进行特定(和不寻常的)实现,例如将变量/值从纵向屏幕模式解析为横向模式,我猜...

      但是,您从最后一个上下文中获得了一个字符串资源,它已经设置好了,解析的变量/值确实如此。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-11-24
        • 1970-01-01
        • 2016-08-06
        • 1970-01-01
        • 1970-01-01
        • 2015-09-17
        • 1970-01-01
        相关资源
        最近更新 更多