Sunday, 28 January 2018

java - Android TextView SetText null object reference error



I am new to android and I am getting a



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



error on my app. I have read other questions on here like this one - java.lang.NullPointerException - setText on null object reference but I still get the same issue. My format is a little bit different as this is done in a Fragment and what I am doing is having a Custom Adapter from a listview. Here is my code



fragment_song_genre.xml




xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:bind="http://schemas.android.com/tools">




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



android:layout_width="match_parent"

android:layout_height="match_parent"
android:background="#000">

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


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" />


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" />


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" />




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







That is the main page and it has a Listview in the Bottom and here is the fragment that calls that xml layout



 public class FilterSongGenreFragment extends BaseFragment {

private SongGenreBinding binding;

private ArrayList 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 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();
}

}



Here is the xml for the listview custom style genre_list_text.xml





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


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" />

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" />




and here is my adapter and as stated before the error happens in the SetText area



  public class FilterSongsAdapter extends ArrayAdapter {

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;
}





}


The SetText inside the GetView is throwing the exception every time, that TextView should have 3 objects names from the Names String Array which I have seen that it has. Based on the error I know that i'm setting the SetText before the FindByID method locates the TextView but I have moved things around and nothing works. Any help would be great . I also been following this tutorial for reference https://www.youtube.com/watch?v=99C_UpLcBRk . I do not know if maybe with a Fragment things are different.


Answer



in your layout you have given default id to TextView android:id="@android:id/text1".



and in JAVA file you are giving R.id.text1




make changes in xml or java.



ether change in xml from android:id="@android:id/text1" to android:id="@+id/text1"
or in java android.R.id.text1


No comments:

Post a Comment

casting - Why wasn't Tobey Maguire in The Amazing Spider-Man? - Movies & TV

In the Spider-Man franchise, Tobey Maguire is an outstanding performer as a Spider-Man and also reprised his role in the sequels Spider-Man...