getActivity()。findViewById(int id)即使在fragment完成构建之后也返回null

时间:2016-11-08 09:44:30

标签: java android android-fragments

我正在android's website进行Android培训。我陷入了碎片的某个角落。问题是我无法在片段中获得对textview的引用。

TextView view = (TextView) getActivity().findViewById(R.id.article_s);

我在一个活动中有两个片段。一个是简单的ListFragment,另一个是简单的TextView。这是片段和活动布局xml文件。

ArticleFragment:

<!-- This is fragment_article.xml -->
<?xml version="1.0" encoding="utf-8"?>
<TextView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Some Text"
    android:textSize="18sp"
    android:id="@+id/article_s"/>

MainActivity(我的所有片段的容器)

<!-- This is activity_main.xml -->
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">

<fragment
    android:layout_height="match_parent"
    android:name="com.example.bora.fragmentsmyway.HeadlinesFragment"
    android:id="@+id/headlines_fragment"
    android:layout_weight="1"
    android:layout_width="0dp" />

<fragment
    android:layout_height="match_parent"
    android:name="com.example.bora.fragmentsmyway.ArticleFragment"
    android:layout_weight="2"
    android:id="@+id/article_fragment"
    android:layout_width="0dp" />

</LinearLayout>

我的ArticleFragment中有一个公共方法,它使用字符串来更新自身文本视图的内容:

public void updateView(String article) {
        TextView view = (TextView) getActivity().findViewById(R.id.article_s);
        try{
            view.setText(article);
        } catch (NullPointerException e) {
            e.printStackTrace();
        }
    }

创建所有视图后,我从MainActivity中调用updateView方法。但是当我试图找到文章TextView时,我得到NullPointerException。我尝试过清理,更改TextView的资源ID。

但是我找到了解决这个问题的方法。我不知道为什么但是当我在TextView中用LinearLayout包裹fragment_article.xml时,它似乎有效:

<LinearLayout
    xmlns:android="..."
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Some Text"
        android:textSize="18sp"
        android:id="@+id/article_s" />

</LinearLayout>

但是我想知道:在教程示例中,如何编写代码并且在我编写时无法工作?我逐字检查了每个代码,但我们的蚂蚁和他们之间没有区别。是因为版本?

我正在使用API​​ 23,它是棉花糖。

4 个答案:

答案 0 :(得分:2)

确保在调用updateView

之前将片段附加到活动

 TextView view = (TextView) getActivity().findViewById(R.id.article_s);

会给你NPE因为它不属于活动

在您执行

的情况下,视图属于片段
 View view = inflater.inflate(R.layout.fragment_layout, container, false);
 TextView textView = (TextView) view.findViewById(R.id.article_s);

具体来说,片段可以使用getActivity()访问Activity实例,并轻松执行任务,例如在活动布局中查找视图:

阅读活动@ https://developer.android.com/guide/components/fragments.html

因此,您使用getActivity查找属于活动的视图,而不是代码中的情况。

编辑 -

LinearLayout包装它不应该有任何区别,因为它只是一个视图组。如果您只需要一个textview,则无需LinearLayout

阅读接受的答案:Difference between getActivity() and view in Fragment

答案 1 :(得分:1)

使用此代码:您在TextView上给出了错误的ID

TextView view = (TextView) getActivity().findViewById(R.id.article_s);

答案 2 :(得分:0)

这是返回NPE,因为您尝试查找错误的ID。 您可以通过两种不同的方式解决问题。

  

1)第一个

<TextView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Some Text"
    android:textSize="18sp"
    android:id="@+id/article"/> 

TextView view = (TextView) getActivity().findViewById(R.id.article);

另一种方法是保持您的XML不变。尝试在java代码中进行以下更改。

  

2)第二个

<TextView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Some Text"
        android:textSize="18sp"
        android:id="@+id/article_s"/> 

TextView view = (TextView) getActivity().findViewById(R.id.article_s);

答案 3 :(得分:0)

如果您在主要活动中使用主活动代码或片段类,则在片段类内部不会像这样工作,您不需要使用getActivity()

如果它在片段类中,你需要像这样应用它:

 @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

        View rootView = inflater.inflate(R.layout.your_fragment_layout_xml, container, false);
        TextView AboutUs = (TextView) rootView.findViewById(R.id.id_of_textview);