There is no error showing in the Java file or resources file. This app builds and installs on my device but when I run it, it shows nothing and crashes. What can I do? Here is all of the code and the error message from Logcat when I open the app from my device:
Error Message:
2020-11-13 16:09:33.634 26684-26684/com.example.android.playmanplay E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.android.playmanplay, PID: 26684
java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference
at com.example.android.playmanplay.CustomAdapter.getView(CustomAdapter.java:52)
at android.widget.AbsListView.obtainView(AbsListView.java:2408)
at android.widget.ListView.makeAndAddView(ListView.java:2126)
at android.widget.ListView.fillDown(ListView.java:851)
at android.widget.ListView.fillDown(ListView.java:833)
at android.widget.ListView.fillFromTop(ListView.java:921)
at android.widget.ListView.layoutChildren(ListView.java:1900)
at android.widget.AbsListView.onLayout(AbsListView.java:2204)
at android.view.View.layout(View.java:20699)
at android.view.ViewGroup.layout(ViewGroup.java:6198)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1812)
at android.widget.LinearLayout.layoutHorizontal(LinearLayout.java:1801)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1567)
at android.view.View.layout(View.java:20699)
at android.view.ViewGroup.layout(ViewGroup.java:6198)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
at android.view.View.layout(View.java:20699)
at android.view.ViewGroup.layout(ViewGroup.java:6198)
at androidx.appcompat.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:446)
at android.view.View.layout(View.java:20699)
at android.view.ViewGroup.layout(ViewGroup.java:6198)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
at android.view.View.layout(View.java:20699)
at android.view.ViewGroup.layout(ViewGroup.java:6198)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1812)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1656)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1565)
at android.view.View.layout(View.java:20699)
at android.view.ViewGroup.layout(ViewGroup.java:6198)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
at com.android.internal.policy.DecorView.onLayout(DecorView.java:757)
at android.view.View.layout(View.java:20699)
at android.view.ViewGroup.layout(ViewGroup.java:6198)
at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2872)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2399)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1534)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7421)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1092)
at android.view.Choreographer.doCallbacks(Choreographer.java:888)
at android.view.Choreographer.doFrame(Choreographer.java:819)
at android.view.Choreographer$FrameHandler.handleMessage(Choreographer.java:991)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:201)
at android.app.ActivityThread.main(ActivityThread.java:6810)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:873)
MainActivity.java:
package com.example.android.playmanplay;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private ListView listview;
private String[] countryNames;
int[] flags = {R.drawable.afghanistan,R.drawable.bangladesh,R.drawable.bhutan,R.drawable.brazil,R.drawable.canada,
R.drawable.china,R.drawable.denmark,R.drawable.egypt,R.drawable.france,R.drawable.ghana,R.drawable.haiti,
R.drawable.iran,R.drawable.iran,R.drawable.japan,R.drawable.kenya,R.drawable.norway,R.drawable.netherlands,
R.drawable.oman,R.drawable.pakistan,R.drawable.pakistan,R.drawable.russia,R.drawable.slovakia,R.drawable.srilanka,
R.drawable.tajikistan,R.drawable.uzbekistn,R.drawable.wales,R.drawable.zimbabwe};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
countryNames = getResources().getStringArray(R.array.name_list);
listview = findViewById(R.id.list_vew);
//ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,R.layout.text_setter,R.id.text_view,countryNames);
CustomAdapter adapter = new CustomAdapter(this,countryNames,flags);
listview.setAdapter(adapter);
}
}
CustomAdapter.java:
package com.example.android.playmanplay;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
public class CustomAdapter extends BaseAdapter {
int[]flags;
String[]countryNames;
Context context;
private LayoutInflater inflater;
CustomAdapter(Context context, String[] countryNames,int[] flags){
this.context = context;
this.countryNames = countryNames;
this.flags = flags;
}
@Override
public int getCount() {
return countryNames.length;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view;
if(convertView == null){
inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = this.inflater.inflate(R.layout.text_setter,parent,false);
}
else{
view = convertView;
}
ImageView imageView = convertView.findViewById(R.id.imageview);
TextView textView = convertView.findViewById(R.id.text_view);
imageView.setImageResource(flags[position]);
textView.setText(countryNames[position]);
return (view);
}
}
activity_main.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:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#3D5AFE"
tools:context=".MainActivity">
<ListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:divider="@color/teal_200"
android:dividerHeight="2dp"
android:id="@+id/list_vew"
/>
</LinearLayout>
text_setter.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:weightSum="4"
android:layout_width="match_parent"
android:layout_height="70dp"
android:layout_marginBottom="10dp"
android:layout_marginTop="10dp"
android:orientation="horizontal"
>
<ImageView
android:id="@+id/imageview"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:contentDescription="@string/flag_of_country"
android:src="@drawable/afghanistan" />
<LinearLayout
android:layout_weight="3"
android:layout_width="0dp"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_marginTop="5dp"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="@string/bangladesh"
android:gravity="center_horizontal"
android:textStyle="bold"
android:id="@+id/text_view" />
<TextView
android:id="@+id/textviewdown"
android:layout_marginTop="5dp"
android:gravity="center_horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
android:textAppearance="?android:attr/textAppearanceSmall"/>
</LinearLayout>
</LinearLayout>
</LinearLayout>
You are trying to set size with an appearance:
<TextView
android:id="@+id/textviewdown"
android:layout_marginTop="5dp"
android:gravity="center_horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
android:textSize="?android:attr/textAppearanceSmall"/>
This is your view that is throwing an UnsupportedOperationException
.
Remove the text size and add android:textAppearance="?android:attr/textAppearanceSmall