Fragment 中的 TextView 在 Android Studio 中返回 Null

TextView in Fragment Returning Null in Android Studio

我是 Android Studio 的新手。我在 Fragment 内的 TextView 上遇到空指针异常错误,请帮忙。这是我的代码。这不过是两个片段之间的简单接口。单击 ListView 片段中的项目时出现空指针异常错误。确保 DetailsFragment 中的 TextView 没有分配或指向它的来源。请帮助解决这个问题。

   public class MainActivity extends AppCompatActivity implements list_Fragment.ItemSelected {

    ArrayList<String> Descriptions = new ArrayList<String>();;
    TextView tvDescription;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Descriptions.add("Description for Item 1");
        Descriptions.add("Description for Item 2");
        Descriptions.add("Description for Item 3");
        Descriptions.add("Description for Item 4");
        tvDescription = findViewById(R.id.tvDescription);
    }

    @Override
    public void onItemSelected(int index) {
        tvDescription.setText(Descriptions.get(index));
    }}

list_fragment

public class list_Fragment extends ListFragment {

    ArrayList<String> Data = new ArrayList<String>();


    ItemSelected activity;
    public interface ItemSelected{
void onItemSelected(int index);
    }

    public list_Fragment() {
        // Required empty public constructor
    }

    @Override
    public void onAttach(@NonNull Context context) {
        super.onAttach(context);
        activity=(ItemSelected) context;
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        Data.add("Item 1");
        Data.add("Item 2");
        Data.add("Item 3");
        Data.add("Item 4");
        setListAdapter(new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, Data));
    }

    @Override
    public void onListItemClick(@NonNull ListView l, @NonNull View v, int position, long id) {

        activity.onItemSelected(position);
    }
}

以及我认为出现错误的详细片段代码是

public class DetailsFragment extends Fragment {

    public DetailsFragment() {
        // Required empty public constructor
    }
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return (LinearLayout) inflater.inflate(R.layout.fragment_details, container, false);
    }
}

主XML文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/ll_Horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    tools:context=".MainActivity">


    <androidx.fragment.app.FragmentContainerView
        android:id="@+id/listfragmentView"
        android:name="com.example.fragmentcheck.list_Fragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="3"
        android:background="@android:color/holo_blue_dark"
        tools:layout="@layout/fragment_list_" />

    <androidx.fragment.app.FragmentContainerView
        android:id="@+id/detailsfragmentView"
        android:name="com.example.fragmentcheck.DetailsFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:background="@color/purple_200"
        tools:layout="@layout/fragment_details" />
</LinearLayout>

列表片段XML

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/linearLayout2"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/design_default_color_primary_variant"
    android:orientation="vertical"
    tools:context=".list_Fragment">


        <ListView
            android:id="@+id/list"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
</LinearLayout>

DetailsFragmentXML

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/linearLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/design_default_color_on_secondary"
    android:orientation="vertical"
    tools:context=".DetailsFragment">


    <TextView
        android:id="@+id/tvDescription"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/textview"
        android:textColor="#FFFFFF"
        android:textSize="20sp" />

</LinearLayout>

错误

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.fragmentcheck, PID: 28112
    java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object r*emphasized text*eference
        at com.example.fragmentcheck.MainActivity.onItemSelected(MainActivity.java:34)
        at com.example.fragmentcheck.list_Fragment.onListItemClick(list_Fragment.java:54)

tvDescriptionDetailsFragment布局中,您需要在代码中为Class

做任何布局配置


class DetailsFragment extends Fragment {

...

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

        View view = inflater.inflate(R.layout.fragment_details, container, false)
          tvDescription = view.findViewById(R.id.tvDescription);
          tvDescription.setText("some text");
       
        return view
    }

}

您在 DetailsFragment xml 中有 tvDescription,而您在 MainAcitvity 中找到它的 ID。 MainActivity 只有 FragmentContainerView ,里面没有任何文本视图。

您需要膨胀 Fragment 的视图并在 View 上调用 findViewById() returns。

已更新详细信息片段

public class DetailsFragment extends Fragment {

    TextView tvDescription;
    public DetailsFragment() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
          View view = inflater.inflate(R.layout.fragment_details, container, false)
          tvDescription = view.findViewById(R.id.tvDescription);
          tvDescription.setText("some text");
       
        return view
    }
}

同时更改:androidx.fragment.app.FragmentContainerView

收件人:片段

在main_activityxml