Приложение останавливается при получении данных через намерение и отображении их в виде списка - PullRequest
1 голос
/ 28 апреля 2020

Я занимаюсь разработкой приложения, в котором я отправляю данные из одного действия в другое и отображаю их в Listview.

В моем коде нет ошибок, и я также проверил ошибки Logcat, но ошибок нет и мое приложение закрывается.

Я приложил код для справки.

Это напоминание. java

Напоминание. java

    public class Reminder extends AppCompatActivity {

    ListView listView;
    TextView custom_reminder;
    ArrayList<String> reminders;
    ArrayAdapter<String> adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_reminder);

        getSupportActionBar().setTitle("Reminders");
        getSupportActionBar().setDisplayShowHomeEnabled(true);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        custom_reminder = (TextView) findViewById(R.id.textView3);
        listView = (ListView) findViewById(R.id.listView);
        reminders = new ArrayList<>();
        adapter = new ArrayAdapter<>(Reminder.this, R.layout.reminder_row, R.id.reminder, reminders);
        custom_reminder.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(Reminder.this, WorkReminder.class);
                startActivity(intent);
            }
        });

        String reminderName = getIntent().getStringExtra("REMINDER_NAME");
        reminders.add(reminderName);
        listView.setAdapter(adapter);

    }
}

Это WorkReminder. java

WorkReminder. java

    public class WorkReminder extends AppCompatActivity{

    private int notificationId = 1;
    EditText reminder_text;
    TimePicker timePicker;
    Button setReminder, cancel;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_work_reminder);
        getSupportActionBar().setTitle("Create reminders");
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDisplayShowHomeEnabled(true);

        createNotificationChannel();
        reminder_text = (EditText) findViewById(R.id.reminder_text);
        timePicker = (TimePicker) findViewById(R.id.timePicker);
        setReminder = (Button) findViewById(R.id.set_button);
        cancel = (Button) findViewById(R.id.cancel_button);

        setReminder.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
            if (reminder_text.getText().toString().isEmpty()){
                    reminder_text.setError("Fields can't be empty.");
                    reminder_text.setFocusable(true);
            }
            else {
                Toast.makeText(WorkReminder.this, "Reminder Set!", Toast.LENGTH_SHORT).show();
                Intent intent = new Intent(WorkReminder.this, AlarmReceiver.class);
                intent.putExtra("notificationId", notificationId);
                intent.putExtra("todo", reminder_text.getText().toString());
                PendingIntent pendingIntent = PendingIntent.getBroadcast(WorkReminder.this, 0, intent, 0);

                AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
                int hour = timePicker.getCurrentHour();
                int minute = timePicker.getCurrentMinute();

                // Create time.
                Calendar startTime = Calendar.getInstance();
                startTime.set(Calendar.HOUR_OF_DAY, hour);
                startTime.set(Calendar.MINUTE, minute);
                startTime.set(Calendar.SECOND, 0);
                long alarmStartTime = startTime.getTimeInMillis();

                // Set alarm.
                // set(type, milliseconds, intent)
                alarmManager.set(AlarmManager.RTC_WAKEUP, alarmStartTime, pendingIntent);

                String reminder_name = reminder_text.getText().toString();
                String time = hour + ":" + minute;

                Intent intent1 = new Intent(WorkReminder.this, Reminder.class);
                intent1.putExtra("REMINDER_NAME", reminder_name);
                intent1.putExtra("TIME", time);
                startActivity(intent1);

            }
            }
        });

        cancel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(WorkReminder.this, "Reminder cancelled!", Toast.LENGTH_SHORT).show();
                Intent intent = new Intent(WorkReminder.this, AlarmReceiver.class);
                AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
                PendingIntent pendingIntent = PendingIntent.getBroadcast(WorkReminder.this, 0, intent, 0);
                alarmManager.cancel(pendingIntent);
            }
        });
    }

    private void createNotificationChannel(){
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
            CharSequence title = "Reminder!";
            String description = "test";
            int importance = NotificationManager.IMPORTANCE_HIGH;
            NotificationChannel channel = new NotificationChannel("reminder", title, importance);
            channel.setDescription(description);

            NotificationManager notificationManager = getSystemService(NotificationManager.class);
            notificationManager.createNotificationChannel(channel);
        }
    }
}

Remder_row. 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="wrap_content"
    android:orientation="vertical"
    android:padding="16dp">
    <TextView
        android:id="@+id/reminder"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Main Title"
        android:textColor="#000"
        android:textStyle="bold"
        android:layout_margin="0dp"
        android:textSize="16sp"/>
    <TextView
        android:id="@+id/time"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Time"
        android:textColor="#000"
        android:textStyle="bold"
        android:layout_marginTop="3dp"
        android:textSize="16sp"/>
</LinearLayout>

Logcat

    java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference
    at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:445)
    at android.widget.ArrayAdapter.getView(ArrayAdapter.java:407)
    at android.widget.AbsListView.obtainView(AbsListView.java:2372)
    at android.widget.ListView.makeAndAddView(ListView.java:2052)
    at android.widget.ListView.fillDown(ListView.java:786)
    at android.widget.ListView.fillFromTop(ListView.java:847)
    at android.widget.ListView.layoutChildren(ListView.java:1826)
    at android.widget.AbsListView.onLayout(AbsListView.java:2171)
    at android.view.View.layout(View.java:19590)
    at android.view.ViewGroup.layout(ViewGroup.java:6053)
    at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1080)
    at android.view.View.layout(View.java:19590)
    at android.view.ViewGroup.layout(ViewGroup.java:6053)
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
    at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
    at android.view.View.layout(View.java:19590)
    at android.view.ViewGroup.layout(ViewGroup.java:6053)
    at androidx.appcompat.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:446)
    at android.view.View.layout(View.java:19590)
    at android.view.ViewGroup.layout(ViewGroup.java:6053)
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
    at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
    at android.view.View.layout(View.java:19590)
    at android.view.ViewGroup.layout(ViewGroup.java:6053)
    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1791)
    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1635)
    at android.widget.LinearLayout.onLayout(LinearLayout.java:1544)
    at android.view.View.layout(View.java:19590)
    at android.view.ViewGroup.layout(ViewGroup.java:6053)
    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:758)
    at android.view.View.layout(View.java:19590)
    at android.view.ViewGroup.layout(ViewGroup.java:6053)
    at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2484)
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2200)
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1386)
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6733)
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:911)
    at android.view.Choreographer.doCallbacks(Choreographer.java:723)
    at android.view.Choreographer.doFrame(Choreographer.java:658)
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:897)
    at android.os.Handler.handleCallback(Handler.java:789)
    at android.os.Handler.dispatchMessage(Handler.java:98)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6541)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

Я пытаюсь получить данные напоминания из WorkReminder. java и отправить их в напоминание. java через Intent. А в напоминании. java я использую listView для отображения тех же данных.

Каждый раз, когда пользователь делает напоминание, список должен добавить его.

1 Ответ

1 голос
/ 02 мая 2020

Вы помещаете в строку адаптера массива значение "null". Пожалуйста, проверьте нулевое имя напоминания перед добавлением его в массив.

String reminderName = getIntent().getStringExtra("REMINDER_NAME");
if (reminderName != null) {
    reminders.add(reminderName);
}
adapter = new ArrayAdapter<>(Reminder.this, R.layout.reminder_row, R.id.reminder, reminders);
listView.setAdapter(adapter);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...