Fragment中的视图为null

时间:2013-07-31 23:08:45

标签: android android-fragments

我的一项活动中ViewPager内有许多片段。这些片段上有文字。我的目标是在活动中发生事件时更新片段上的文本。

我尝试过一些东西,但我似乎无法找到合适的观点。在下面的代码中,我尝试将视图从onCreateView保存到私有字段。这在创建我的片段时效果很好,但是当我尝试拨打refresh时,我的mView为空。

refresh在接口中实现。我的ViewPager有2个不同的片段,所以我实现了接口,允许我投射一个未知片段来调用刷新。

我尝试编写以下代码以最好地说明我的问题。我可以将文本设置为“Hello”,但在刷新时,活动将崩溃,因为mView为空。

    private View mView = null;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        if (container == null) { return null; }         
        View view = inflater.inflate(R.layout.view_account_general, container, false);
        mView = view;
        setContent();
        return view;
    }

    private void setContent() {
        if (mView == null) return;
        ((TextView) mView.findViewById(R.id.mId)).setText("Hello");
    }

    @Override
    public void refresh() {
        ((TextView) mView.findViewById(R.id.mId)).setText("Test");
    }

我做错了什么,我应该做什么呢?碎片对我来说很新,而且我很长时间没有为Android编程。我的唯一目的是在调用TextView方法时更新refresh的值。

感谢您帮我解决问题的任何尝试!

编辑: 根据要求,异常跟踪。

FATAL EXCEPTION: main
java.lang.NullPointerException
    at com.jordanmoore.finances.AccountGeneralFragment.refresh(AccountGeneralFragment.java:85)
    at com.jordanmoore.finances.AccountActivity.onOptionsItemSelected(AccountActivity.java:222)
    at android.app.Activity.onMenuItemSelected(Activity.java:2534)
    at android.support.v4.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:361)
    at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java:964)
    at com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:735)
    at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:149)
    at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:874)
    at com.android.internal.view.menu.MenuPopupHelper.onItemClick(MenuPopupHelper.java:156)
    at android.widget.AdapterView.performItemClick(AdapterView.java:298)
    at android.widget.AbsListView.performItemClick(AbsListView.java:1090)
    at android.widget.AbsListView$PerformClick.run(AbsListView.java:2863)
    at android.widget.AbsListView$1.run(AbsListView.java:3538)
    at android.os.Handler.handleCallback(Handler.java:615)
    at android.os.Handler.dispatchMessage(Handler.java:92)
    at android.os.Looper.loop(Looper.java:213)
    at android.app.ActivityThread.main(ActivityThread.java:4786)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)
    at dalvik.system.NativeStart.main(Native Method)

1 个答案:

答案 0 :(得分:0)

底线 - 片段应该控制刷新它自己的视图。一个活动永远不应该在片段中调用“刷新”方法,因为它很难确定片段何时被初始化并准备好渲染。

在您的情况下,您的活动可以广播“更新”,您的片段会注册接收。只要您确保在满足前提条件后进行注册,并在前提条件变为无效之前取消注册,事情就会起作用。例如,按照onResume()中取消注册时onPause()注册的典型模式。