我的一项活动中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)
答案 0 :(得分:0)
底线 - 片段应该控制刷新它自己的视图。一个活动永远不应该在片段中调用“刷新”方法,因为它很难确定片段何时被初始化并准备好渲染。
在您的情况下,您的活动可以广播“更新”,您的片段会注册接收。只要您确保在满足前提条件后进行注册,并在前提条件变为无效之前取消注册,事情就会起作用。例如,按照onResume()
中取消注册时onPause()
注册的典型模式。