在片段的onViewCreated方法

时间:2016-08-15 03:30:09

标签: android android-layout android-fragments

我不完全确定我应该提供哪种其他类型的信息/代码。奇怪的是,在一个不同的片段和活动中,这几乎相同的代码正在运行。这是我的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。

1 个答案:

答案 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

有关良好代码质量的更多信息,您可以使用此标准。