我不完全确定我应该提供哪种其他类型的信息/代码。奇怪的是,在一个不同的片段和活动中,这几乎相同的代码正在运行。这是我的onViewCreated
方法:
内部碎片:
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
mHelveticaTF = Typeface.createFromAsset(getActivity().getAssets(), "fonts/Helvetica.otf");
oopsTV = (TextView) view.findViewById(R.id.noClub_oops); // I've tried getView() and getActivity() - same result
oopsTV.setTypeface(mHelveticaTF); // Null pointer exception here.
}
@Override
public void View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_no_club_membership, container, false);
}
空指针异常发生在oopsTV上的setTypeface
调用中(显然为空)。 onCreateView
似乎正在膨胀正确的.xml文件。 R.id.noClub_oops
肯定在我的.xml文件中作为TextView。
这个空指针异常也会在片段膨胀之后和返回视图之前在onCreateView中发生(不是使用getView()
而是使用例如View v
的实际指针。)
在我的活动的onCreate
方法结束时,我创建了一个FragmentTransaction
来显示我的片段:
内部活动:
setContentView(R.layout.activity_create_club);
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.CreateClubHolder, newClubFormFragment.newInstance());
ft.commit();
这是我的fragment_no_club_membership.xml文件:
<LinearLayout xmlns:android="http://schemas.com/android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
...
...
<TextView
android:name="@+id/noClub_oops"
我已经厌倦了清理项目并再次运行。相同的空指针异常。
这是堆栈跟踪(隐私的已编辑文件夹路径名):
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.widget.TextView.setTypeface(android.graphics.Typeface)' on a null object reference
at com.myname.cs.createClub.NoClubMembershipFragment.onViewCreated(NoClubMembershipFragment.java:52)
更新
我忽略了在onViewCreated方法中检索按钮的代码:
public void onViewCreated(View view, Bundle savedInstanceState) {
mHelveticaTF = Typeface.createFromAsset(getActivity().getAssets(), "fonts/Helvetica.otf");
oopsTV = (TextView) view.findViewById(R.id.noClub_oops); // I've tried getView() and getActivity() - same result
oopsTV.setTypeface(mHelveticaTF); // Null pointer exception here.
// oopsTV.isActivated() crashes the program.
createClubButton = (Button) view.findViewById(R.id.noClub_create);
// createClubButton.isActivated() does NOT crash the program. Button is not null.
}
我刚刚发现按钮不为空,我可以从findViewById
检索它。当我摆脱改变字体的调用时,我没有例外,我可以在我的应用程序,TextViews和所有内容上看到我的片段视图。看起来TextViews正在膨胀,但我无法检索它们。当我在这些TextView上运行isActivated
时,我得到一个空指针异常。
所以似乎问题是我无法检索TextViews,尽管它们正在充气,但我可以检索其他组件,如Buttons。
答案 0 :(得分:0)
请使用 Context 而不是 getActivity()。 您可以从片段中获取来自父Activity的 Context ,如下所示。
private Context mContext;
@Override
public void onAttach(Context context) {
super.onAttach(context);
mContext=context;
}
如果你需要Fragment中的Activity实例而不是简单地将 Context 转换为 Activity ,如下所示
Activity activity= (Activity) mContext;//If needed
有关良好代码质量的更多信息,您可以使用此标准。