当通过意图获取数据并在列表视图中显示时,应用程序被停止。

问题描述 投票:0回答:1

我正在开发一个应用程序,在这个应用程序中,我将数据从一个活动发送到另一个活动,并在Listview中显示相同的数据。

我的代码中没有错误,我也检查了Logcat的错误,但没有任何错误,我的应用程序正在被关闭。

我已经附上了代码供参考。

这是Reminder.java

Reminder.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);
        }
    }
}

提醒_行.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中获取提醒数据,并通过Intent将其发送到Reminder.java中。而在Reminder.java中,我使用listView来显示相同的数据。

每次当用户进行提醒时,listview都应该添加它。

java android android-intent android-listview android-arrayadapter
1个回答
2
投票

你把数组适配器字符串用 "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);
© www.soinside.com 2019 - 2024. All rights reserved.