当前位置: 首页 > 面试题库 >

为什么findViewById()在这里不能作为getActivity()。findViewById()使用?

韩嘉胜
2023-03-14
问题内容
    /**
     * A placeholder fragment containing a simple view.
     */
    public static class PlaceholderFragment extends Fragment {

        public PlaceholderFragment() {
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.fragment_detail,
                    container, false);
            // The detail Activity called via intent.  Inspect the intent for forecast data.
            Intent intent=getActivity().getIntent();
            TextView text=(TextView)rootView.findViewById(R.id.text1);
            String b=intent.getStringExtra(Intent.EXTRA_TEXT);
            text.setText(b);

            return rootView;
        }
    }

在这段代码中,当我使用

TextView text=(TextView)getActivity().findViewById(R.id.text1)

然后我的应用崩溃了,Logcat说

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.Window.findViewById(int)' on a null object reference

这是与此代码关联的XML文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.sunshine.app.DetailActivity$PlaceholderFragment" >

    <TextView
        android:id="@+id/text1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

</RelativeLayout>

问题答案:

在这段代码中,当我使用TextView text =(TextView)getActivity()。findViewById(R.id.text1)

然后我的应用程序崩溃了,Logcat说这是由以下原因引起的:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法’android.view.View
android.view.Window.findViewById(int)’

findViewById()上的Activity从根视图(所谓的“装饰视图”)和横穿可用的小部件和容器,寻找一个ID匹配的树开始。因此,findViewById()在上调用Activity只会发现属于整体活动视图层次结构的视图。

但是,您的inflate()呼叫不会将膨胀的内容附加RelativeLayout到活动视图层次结构。这是预期的。当片段本身被附加时,这些视图将被附加到活动视图层次结构中onCreateView()。结果,当您
从内部 调用findViewById()活动
onCreateView(),它找不到您的TextView,因为该活动TextView仅由片段管理,还不是活动视图层次结构的一部分。

findViewById()ViewViewGroup从开始ViewViewGroup与横梁可用的widget和容器,找一个ID匹配的树。在RelativeLayout访问你的TextView,所以当你打电话findViewById()RelativeLayout,你膨胀,它的工作原理。



 类似资料:
  • 问题内容: 我正在尝试通过以下方式将日期范围划分为各个日期: 而且我不知道为什么不起作用,因为日期仍然相同,所以循环变得无限。 问题答案: plusDays不会改变原始的,您必须分配结果:

  • 问题是,我试图使用findViewById()全局初始化TextView对象,但它在运行时抛出一个错误,然后,如果我在onCreate()或任何其他方法中使用它,初始化工作就会很好。 我正在为API级别22及以上开发

  • 我有很多这样的电话: AndroidStudio告诉我,他们可能会获得: -如果第二个参数为null,方法返回null-如果第二个参数为null,否则返回null -一个典型的方法,如果传递给它true将引发异常 检查可以配置为使用自定义注释(默认情况下将使用来自annotations.jar的注释) 幸运的是,everithing可以工作,但我可以对这段代码进行改进吗?

  • 我理解这是指当前对象。所以,与其使用 为什么我不能使用 请参考下面的例子,并在最后看到最后两个评论。

  • 我只是想用robolectric测试某个视图是否在片段中可见。我的单元测试如下所示: 我使用的是最新的android gradle Plugin1.1.3、Robolectirc2.4和robolectric gradle Plugin1.0.1,我的单元测试在文件夹中(而不是)。我无法编译该代码,因为编译器无法解析。 我的: 更新:以下是完整的代码: 代码可以在这里找到:https://gith

  • 这是我的线程: 它得到一个上限和下限以及一个在所有线程上共享的结果。 这是我的测试类: