【问题标题】:Android TextView SetText null object reference errorAndroid TextView SetText 空对象引用错误
【发布时间】:2017-01-26 16:23:25
【问题描述】:

我是 android 新手,我得到了一个

Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference

我的应用程序出错。我在这里阅读了其他问题,例如- java.lang.NullPointerException - setText on null object reference,但我仍然遇到同样的问题。我的格式有点不同,因为这是在片段中完成的,而我正在做的是从列表视图中获得自定义适配器。这是我的代码

fragment_song_genre.xml

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:bind="http://schemas.android.com/tools">

<data class="SongGenreBinding">

    <variable
        name="handler"
        type="com.mgrmobi.joox.fragments.FilterSongGenreFragment" />

</data>

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#000">

    <RelativeLayout
        android:id="@+id/toprow"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="24dp">

        <ImageButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_centerVertical="true"
            android:layout_marginLeft="16dp"
            android:background="@null"
            android:onClick="@{ handler.onCloseClicked }"
            android:src="@drawable/search_close" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_centerVertical="true"
            android:layout_marginLeft="80dp"
            android:text="Genre"
            android:textColor="#fff"
            android:textSize="20sp" />

        <TextView
            android:onClick="@{ handler.reset }"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:layout_marginRight="15dp"
            android:text="@string/reset"
            android:textAllCaps="true"
            android:textColor="#fff"
            android:textSize="12sp" />

    </RelativeLayout>

    <ListView
        android:id="@+id/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/toprow"
        android:layout_marginTop="24dp"></ListView>

</RelativeLayout>

这是主页,底部有一个 Listview,这是调用该 xml 布局的片段

 public class FilterSongGenreFragment extends BaseFragment {

    private SongGenreBinding binding;
    private ArrayList<String> genres;
    String[] names= {"Johm","Paul","Mike"};

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
    }


    private static final String GENRES_KEY = "genres";

    public static FilterSongGenreFragment newInstance(ArrayList<String> genres) {

        Bundle args = new Bundle();
        args.putStringArrayList(GENRES_KEY, genres);
        FilterSongGenreFragment fragment = new FilterSongGenreFragment();
        fragment.setArguments(args);
        return fragment;
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        binding = DataBindingUtil.inflate(inflater, R.layout.fragment_song_genre, container, false);
        binding.setHandler(this);
        genres = getArguments().getStringArrayList(GENRES_KEY);

        initList();
        return binding.getRoot();
    }

    private void initList() {

    // ArrayAdapter adapter = new ArrayAdapter(getActivity(), R.layout.genre_list_text, android.R.id.text1, genres);
     FilterSongsAdapter filterSongsAdapter= new FilterSongsAdapter(getActivity(),names);


        binding.list.setAdapter(filterSongsAdapter);

        binding.list.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> adapterView, View view,int position, long l) {
               ((SongFilterListener) getActivity()).onGenreSelected(genres.get(position));
/*
                    textView = (ImageView) view.findViewById(R.id.selected_genre);
                    textView.setVisibility(View.VISIBLE);
*/
              //  close();
            }

        });

    }

    private void close() {
        getActivity().getFragmentManager().beginTransaction().remove(this).commit();
    }

    public void onCloseClicked(View view) {
        close();
    }

    public void reset(View view) {
        ((SongFilterListener) getActivity()).onResetFilters();
        close();
    }

}

这是列表视图自定义样式的 xml genre_list_text.xml

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <TextView
    android:id="@android:id/text1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:gravity="center_vertical|left"
    android:text="Genre"
    android:paddingBottom="16dp"
    android:paddingLeft="4dp"
    android:paddingTop="16dp"
    android:textColor="#fff"
    android:textSize="16sp" />

        <ImageView
            android:id="@+id/selected_genre"
            android:layout_height="24dp"
            android:layout_width="24dp"
            android:visibility="invisible"
            android:src="@drawable/check_circle"
            android:layout_marginStart="140dp"
            android:layout_centerVertical="true" />

    </RelativeLayout>

这是我的适配器,正如在 SetText 区域发生错误之前所述

  public class FilterSongsAdapter extends ArrayAdapter<String> {

    private Context c;
    String[] names= {};
    LayoutInflater inflater;

    public FilterSongsAdapter(Context context,String[] names) {
        super(context,R.layout.genre_list_text,names);
        this.c=context;
        this.names=names;

    }

    public static class ViewHolder {

       TextView text1;


    }



    @Override
    public View getView(int position,View convertView,ViewGroup parent) {
        ViewHolder holder;
     if(convertView==null){
         holder  = new ViewHolder();
         inflater = (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
         convertView = inflater.from(c).inflate(R.layout.genre_list_text, null);
         // Initialize
         holder.text1=(TextView) convertView.findViewById(R.id.text1);

          convertView.setTag(holder);
    }else {
         holder = (ViewHolder) convertView.getTag();
     }

        holder.text1.setText(names[position]);

        return convertView;
    }




}

GetView 内的 SetText 每次都抛出异常,TextView 应该有 3 个来自我已经看到的名称字符串数组的对象名称。基于错误我知道我在 FindByID 方法找到 TextView 之前设置了 SetText 但我已经移动了一些东西并且没有任何效果。任何帮助都会很棒。我也一直在关注本教程以供参考 https://www.youtube.com/watch?v=99C_UpLcBRk 。我不知道是否可能与 Fragment 不同。

【问题讨论】:

标签: java android listview android-fragments android-arrayadapter


【解决方案1】:

在您的布局中,您已将默认 ID 指定为 TextView android:id="@android:id/text1"。

在 JAVA 文件中,您提供 R.id.text1

在 xml 或 java 中进行更改。

xml 中的以太从 android:id="@android:id/text1" 更改为 android:id="@+id/text1" 或在java中android.R.id.text1

【讨论】:

  • 谢谢,这正是我所需要的。
  • 我的荣幸..:)
【解决方案2】:
@Override
public View getView(int position,View convertView,ViewGroup parent) {
 ViewHolder holder  = new ViewHolder(); //because error says null object reference, it means object of TextView `text1` is not found.
 inflater = (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

 if(convertView==null){

     convertView = inflater.inflate(R.layout.genre_list_text, null);

     holder.text1=(TextView) convertView.findViewById(R.id.text1);
     holder.text1.setText(names[position]);
     convertView.setTag(holder);

}else {
     holder = (ViewHolder) convertView.getTag();
 }
 return convertView;
}

从您提供的XML 代码中,我可以看到您没有为TextView 提供正确的ID。将XML 从android:id="@android:id/text1" 更改为android:id="@+id/text1"。

【讨论】:

  • 哪个“上面给出的答案”?您可以更新您的代码以提供正确的 id
  • @cricket_007 前面提供的答案已经告诉提出问题的用户,他为TextView 添加的ID 在他的findViewById() 中不正确。所以我提到要查看并添加正确的 id。
  • 我明白这一点,但参考其他答案本身并不能完全提供答案
【解决方案3】:

在您的genre_list_text.xml 中将android:id="@android:id/text1" 更改为android:id="@+id/text1"

在你的 getView 方法中

@Override
    public View getView(final int position, View convertView, ViewGroup parent) {

        ViewHolder holder;
        View view = convertView;
            if (view == null) {
                LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                view = inflater.inflate(R.layout.genre_list_text, parent, false);
                viewHolder = new ViewHolder();
                holder.text1=(TextView) view.findViewById(R.id.text1);

                view.setTag(viewHolder);
            } else {
                viewHolder = (ViewHolder) view.getTag();
            }
            holder.text1.setText(names[position]);
            return view;
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-18
    • 2023-03-04
    • 2015-03-10
    • 1970-01-01
    • 2020-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多