繁体   English   中英

即使片段已完成构建,getActivity()。findViewById(int id)仍返回null

[英]getActivity().findViewById(int id) returns null even after fragment has completed building

我正在android网站上进行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有一个公共方法,该方法采用一个字符串来更新其本身的textview的内容:

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。

但是,我已经找到了解决此问题的方法。 我不知道为什么,但是当我在fragment_article.xml中用LinearLayout包装TextView时,它似乎可以工作:

<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。

在调用updateView之前,请确保您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

阅读以下接受的答案: getActivity()与Fragment中的view之间的区别

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

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

这是返回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);

在片段类内部,这种方式不起作用,因为您应该在主要活动中使用主要活动代码或片段类(如果您在主要活动中使用它),则无需使用getActivity()

如果它在fragment类中,则需要这样应用它:

 @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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM