1

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

我已经尝试了一些事情,但我似乎找不到可以使用的视图。在下面的代码中,我尝试将视图从onCreateView私有字段保存。这在创建我的片段时成功,但是当我尝试调用refreshmy时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时更新 my 的值。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)
4

1 回答 1

0

底线 - 片段应该控制刷新它自己的视图。活动不应该在片段中调用“刷新”方法,因为确定片段何时初始化并准备好呈现是很痛苦且容易出错的。

在您的情况下,您的活动可以广播“更新”,您的片段注册接收。只要您确保在满足前提条件后注册,并在前提条件失效之前取消注册,一切都会奏效。例如,遵循onResume()在注销中注册的典型模式onPause()

于 2013-07-31T23:47:10.520 回答