I have seen multiple questions like this on this forum, but nothing I found helped me.
So what's basically happening is that I have an App, which works perfectly fine on my device. I wrote that app for my mother, who has an older phone (Samsung S5neo - Android 6.0.1(API 23)) and for some reason it doesn't work on there.
It show's this error message in the LogCat:
Process: com.gevi.berstunden, PID: 18800
android.view.InflateException: Binary XML file line #47: Binary XML file line #47: Error inflating class EditText
at android.view.LayoutInflater.inflate(LayoutInflater.java:551)
at android.view.LayoutInflater.inflate(LayoutInflater.java:429)
at android.view.LayoutInflater.inflate(LayoutInflater.java:380)
at com.android.internal.policy.PhoneWindow.setContentView(PhoneWindow.java:474)
at android.app.Dialog.setContentView(Dialog.java:837)
at com.gevi.berstunden.MainActivity.onAddHourClick(MainActivity.java:81)
at com.gevi.berstunden.MainActivity.lambda$initViews$0$MainActivity(MainActivity.java:64)
at com.gevi.berstunden.-$$Lambda$MainActivity$Koi270rAtPv4jlW335vCcd1sR2Y.onClick(lambda)
at android.view.View.performClick(View.java:5698)
at android.widget.TextView.performClick(TextView.java:10846)
at android.view.View$PerformClick.run(View.java:22565)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:158)
at android.app.ActivityThread.main(ActivityThread.java:7230)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
Caused by: android.view.InflateException: Binary XML file line #47: Error inflating class EditText
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:794)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:716)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:847)
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:810)
at android.view.LayoutInflater.inflate(LayoutInflater.java:527)
at android.view.LayoutInflater.inflate(LayoutInflater.java:429)
at android.view.LayoutInflater.inflate(LayoutInflater.java:380)
at com.android.internal.policy.PhoneWindow.setContentView(PhoneWindow.java:474)
at android.app.Dialog.setContentView(Dialog.java:837)
at com.gevi.berstunden.MainActivity.onAddHourClick(MainActivity.java:81)
at com.gevi.berstunden.MainActivity.lambda$initViews$0$MainActivity(MainActivity.java:64)
at com.gevi.berstunden.-$$Lambda$MainActivity$Koi270rAtPv4jlW335vCcd1sR2Y.onClick(lambda)
at android.view.View.performClick(View.java:5698)
at android.widget.TextView.performClick(TextView.java:10846)
at android.view.View$PerformClick.run(View.java:22565)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:158)
at android.app.ActivityThread.main(ActivityThread.java:7230)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
Caused by: android.content.res.Resources$NotFoundException: Resource "com.gevi.berstunden:drawable/popupedittext_round" (7f070081) is not a Drawable (color or path): TypedValue{t=0x1/d=0x7f070081 a=-1 r=0x7f070081}
at android.content.res.Resources.loadDrawableForCookie(Resources.java:4178)
at android.content.res.Resources.loadDrawable(Resources.java:4085)
at android.content.res.Resources.loadDrawable(Resources.java:3935)
at android.content.res.TypedArray.getDrawable(TypedArray.java:886)
at android.view.View.<init>(View.java:4226)
at android.widget.TextView.<init>(TextView.java:948)
at android.widget.EditText.<init>(EditText.java:90)
at android.widget.EditText.<init>(EditText.java:86)
at androidx.appcompat.widget.AppCompatEditText.<init>(AppCompatEditText.java:73)
at androidx.appcompat.widget.AppCompatEditText.<init>(AppCompatEditText.java:69)
at androidx.appcompat.app.AppCompatViewInflater.createEditText(AppCompatViewInflater.java:197)
at androidx.appcompat.app.AppCompatViewInflater.createView(AppCompatViewInflater.java:115)
at androidx.appcompat.app.AppCompatDelegateImpl.createView(AppCompatDelegateImpl.java:1407)
at androidx.appcompat.app.AppCompatDelegateImpl.onCreateView(AppCompatDelegateImpl.java:1457)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:758)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:716)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:847)
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:810)
at android.view.LayoutInflater.inflate(LayoutInflater.java:527)
at android.view.LayoutInflater.inflate(LayoutInflater.java:429)
at android.view.LayoutInflater.inflate(LayoutInflater.java:380)
at com.android.internal.policy.PhoneWindow.setContentView(PhoneWindow.java:474)
at android.app.Dialog.setContentView(Dialog.java:837)
at com.gevi.berstunden.MainActivity.onAddHourClick(MainActivity.java:81)
at com.gevi.berstunden.MainActivity.lambda$initViews$0$MainActivity(MainActivity.java:64)
at com.gevi.berstunden.-$$Lambda$MainActivity$Koi270rAtPv4jlW335vCcd1sR2Y.onClick(lambda)
at android.view.View.performClick(View.java:5698)
at android.widget.TextView.performClick(TextView.java:10846)
at android.view.View$PerformClick.run(View.java:22565)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:158)
at android.app.ActivityThread.main(ActivityThread.java:7230)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
On YouTube I found people saying I should add a dependency to my buil.gradle (implementation 'com.android.support:design:28.0.0'), but this didn't help either. I also tried using older versions of this.
My main code is:
package com.gevi.berstunden;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.TimePicker;
public class MainActivity extends AppCompatActivity {
Dialog dialog;
Dialog dateDialog;
Dialog fromTimeDialog;
Dialog toTimeDialog;
String date;
String fromTime;
String toTime;
String reason;
RecyclerView recyclerView;
TextView textView;
TextView totalHoursTextViews;
RecyclerViewListManager manager;
RecyclerViewListAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initManager();
initViews();
}
protected void initManager() {
manager = new RecyclerViewListManager(this);
adapter = new RecyclerViewListAdapter(manager);
}
protected void initViews() {
recyclerView = findViewById(R.id.RecyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(adapter);
adapter.setOnItemClickListener(new RecyclerViewListAdapter.onItemClickListener() {
@Override
public void onItemClick(int position) {
}
});
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new HourListTouchCallback(manager, recyclerView));
itemTouchHelper.attachToRecyclerView(recyclerView);
textView = findViewById(R.id.addTextView);
textView.setOnClickListener(view -> onAddHourClick());
totalHoursTextViews = findViewById(R.id.totalHoursTextView);
totalHoursTextViews.setText(String.valueOf(manager.getTotalHours()));
dialog = new Dialog(this);
dateDialog = new Dialog(this);
fromTimeDialog = new Dialog(this);
toTimeDialog = new Dialog(this);
}
protected void onAddHourClick() {
TextView setDate;
TextView setFromTime;
TextView setToTime;
EditText setReason;
TextView close;
dialog.setContentView(R.layout.popup);
setDate = dialog.findViewById(R.id.setDateTextView);
setDate.setOnClickListener(view -> onSetDateClick());
setFromTime = dialog.findViewById(R.id.setFromTimeTextView);
setFromTime.setOnClickListener(view -> onFromTimeClick());
setToTime = dialog.findViewById(R.id.setToTimeTextView);
setToTime.setOnClickListener(view -> onToTimeClick());
setReason = dialog.findViewById(R.id.reasonEditText);
close = dialog.findViewById(R.id.enterTextView);
close.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Hour hour = new Hour();
hour.setDate(date);
hour.setFromTime(fromTime);
hour.setToTime(toTime);
int hours = Integer.parseInt(toTime.substring(0,2)) - Integer.parseInt(fromTime.substring(0, 2));
int minutes = Integer.parseInt(toTime.substring(3)) - Integer.parseInt(fromTime.substring(3));
reason = setReason.getText().toString();
hour.setReason(reason);
hour.setHours(hours);
hour.setMinutes(minutes);
manager.addHour(hour);
adapter.notifyItemInserted(manager.getHourCount() - 1);
totalHoursTextViews.setText(String.valueOf(manager.getTotalHours()));
dialog.dismiss();
}
});
dialog.show();
}
protected void onSetDateClick() {
DatePicker datePicker;
TextView enter_date;
dateDialog.setContentView(R.layout.date_popup);
datePicker = dateDialog.findViewById(R.id.datepicker);
enter_date = dateDialog.findViewById(R.id.enter_date);
enter_date.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
date = String.valueOf(datePicker.getDayOfMonth()) + "." + String.valueOf(datePicker.getMonth()) + "." + String.valueOf(datePicker.getYear());
dateDialog.dismiss();
}
});
dateDialog.show();
}
protected void onFromTimeClick() {
TimePicker timePicker;
TextView enter_fromTime;
fromTimeDialog.setContentView(R.layout.fromtime_popup);
timePicker = fromTimeDialog.findViewById(R.id.fromTime_timepicker);
timePicker.setIs24HourView(true);
enter_fromTime = fromTimeDialog.findViewById(R.id.enter_fromTime);
enter_fromTime.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int hourlenght = String.valueOf(timePicker.getHour()).length();
int minutelenght = String.valueOf(timePicker.getMinute()).length();
if(hourlenght == 1) {
if(minutelenght == 1) {
fromTime = "0" + String.valueOf(timePicker.getHour()) + ":0" + String.valueOf(timePicker.getMinute());
}
if(minutelenght == 2) {
fromTime = "0" + String.valueOf(timePicker.getHour()) + ":" + String.valueOf(timePicker.getMinute());
}
}
if(hourlenght == 2) {
if(minutelenght == 1) {
fromTime = String.valueOf(timePicker.getHour()) + ":0" + String.valueOf(timePicker.getMinute());
}
if(minutelenght == 2) {
fromTime = String.valueOf(timePicker.getHour()) + ":" + String.valueOf(timePicker.getMinute());
}
}
fromTimeDialog.dismiss();
}
});
fromTimeDialog.show();
}
protected void onToTimeClick() {
TimePicker timePicker;
TextView enter_toTime;
toTimeDialog.setContentView(R.layout.totime_popup);
timePicker = toTimeDialog.findViewById(R.id.toTime_timepicker);
timePicker.setIs24HourView(true);
enter_toTime = toTimeDialog.findViewById(R.id.enter_toTime);
enter_toTime.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int hourlenght = String.valueOf(timePicker.getHour()).length();
int minutelenght = String.valueOf(timePicker.getMinute()).length();
if(hourlenght == 1) {
if(minutelenght == 1) {
toTime = "0" + String.valueOf(timePicker.getHour()) + ":0" + String.valueOf(timePicker.getMinute());
}
if(minutelenght == 2) {
toTime = "0" + String.valueOf(timePicker.getHour()) + ":" + String.valueOf(timePicker.getMinute());
}
}
if(hourlenght == 2) {
if(minutelenght == 1) {
toTime = String.valueOf(timePicker.getHour()) + ":0" + String.valueOf(timePicker.getMinute());
}
if(minutelenght == 2) {
toTime = String.valueOf(timePicker.getHour()) + ":" + String.valueOf(timePicker.getMinute());
}
}
toTimeDialog.dismiss();
}
});
toTimeDialog.show();
}
}
and the corresponding xml file is the following:
<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:orientation="vertical"
android:weightSum="100"
tools:context=".MainActivity"
android:background="@color/colorPrimary">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="30dip"
android:text="@string/topTextView"
android:textSize="100px"
android:textColor="@color/text_color"
android:layout_gravity="center"
android:gravity="center"/>
<androidx.recyclerview.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="100"
android:id="@+id/RecyclerView"
tools:listitem="@layout/row"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/totalHoursTextView"
android:text="Stunden: 23.5"
android:textSize="80px"
android:textColor="@color/text_color"
android:layout_gravity="center"
android:gravity="center"
android:layout_marginTop="20dip"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/addTextView"
android:layout_margin="20dip"
android:layout_gravity="center"
android:gravity="center"
android:text="@string/addHoursTextView"
android:textColor="@color/near_white"
android:textSize="30dip"
android:background="@drawable/textview_round"
android:padding="5dip"/>
</LinearLayout>
however I followed the error log of the LogCat, pinpointing the issue to the Dialogs xml-file:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:orientation="vertical"
android:padding="20dip"
android:background="@color/colorPrimary">
<TextView
android:layout_width="wrap_content"
android:layout_height="30dip"
android:id="@+id/setDateTextView"
android:layout_gravity="center"
android:gravity="center"
android:text="@string/setDate"
android:textColor="@color/near_white"
android:background="@drawable/popuptextview_round"
android:padding="5dip"
android:layout_marginBottom="15dip"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="30dip"
android:id="@+id/setFromTimeTextView"
android:layout_gravity="center"
android:gravity="center"
android:text="@string/setFromTime"
android:textColor="@color/near_white"
android:background="@drawable/popuptextview_round"
android:padding="5dip"
android:layout_marginBottom="15dip"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="30dip"
android:id="@+id/setToTimeTextView"
android:layout_gravity="center"
android:gravity="center"
android:text="@string/setToTime"
android:textColor="@color/near_white"
android:background="@drawable/popuptextview_round"
android:padding="5dip"
android:layout_marginBottom="15dip"/>
<EditText
android:layout_width="wrap_content"
android:layout_height="30dip"
android:id="@+id/reasonEditText"
android:layout_gravity="center"
android:gravity="center"
android:hint="@string/addReasonEditTextHint"
android:textColorHint="@color/hint_color"
android:textColor="@color/text_color"
android:background="@drawable/popupedittext_round"
android:padding="5dip"
android:layout_marginBottom="20dip"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="30dip"
android:id="@+id/enterTextView"
android:layout_gravity="center"
android:gravity="center"
android:text="@string/popup_enter"
android:textColor="@color/near_white"
android:background="@drawable/popuptextview_round"
android:padding="5dip"/>
</LinearLayout>