有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java TextView空指针异常

UPDATE: Found the answer. Solved the problem.

这不是一个重复的问题。我找不到哪个文本视图变为空,因为所有内容都在初始化

请告诉我哪个文本视图没有初始化

The layout is simple:

错误消息是

E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: com.pronoy.mukhe.todoapplication, PID: 11245
                  java.lang.NullPointerException: Attempt to invoke virtual method 'void

安卓.widget.TextView.setText(java.lang.CharSequence)' on a null object reference at 安卓.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:392) at 安卓.widget.ArrayAdapter.getView(ArrayAdapter.java:362) at 安卓.widget.AbsSpinner.onMeasure(AbsSpinner.java:197) at 安卓.widget.Spinner.onMeasure(Spinner.java:507) at 安卓.support.v7.widget.AppCompatSpinner.onMeasure(AppCompatSpinner.java:426) at 安卓.view.View.measure(View.java:17429) at 安卓.support.constraint.ConstraintLayout.internalMeasureChildren(ConstraintLayout.java:1210) at 安卓.support.constraint.ConstraintLayout.onMeasure(ConstraintLayout.java:1550) at 安卓.view.View.measure(View.java:17429) at 安卓.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463) at 安卓.widget.FrameLayout.onMeasure(FrameLayout.java:430) at 安卓.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:139) at 安卓.view.View.measure(View.java:17429) at 安卓.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463) at 安卓.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436) at 安卓.widget.LinearLayout.measureVertical(LinearLayout.java:722) at 安卓.widget.LinearLayout.onMeasure(LinearLayout.java:613) at 安卓.view.View.measure(View.java:17429) at 安卓.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463) at 安卓.widget.FrameLayout.onMeasure(FrameLayout.java:430) at 安卓.view.View.measure(View.java:17429) at 安卓.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463) at 安卓.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436) at 安卓.widget.LinearLayout.measureVertical(LinearLayout.java:722) at 安卓.widget.LinearLayout.onMeasure(LinearLayout.java:613) at 安卓.view.View.measure(View.java:17429) at 安卓.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463) at 安卓.widget.FrameLayout.onMeasure(FrameLayout.java:430) at com.安卓.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2815) at 安卓.view.View.measure(View.java:17429) at 安卓.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2001) at 安卓.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1141) at 安卓.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1372) at 安卓.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1054) at 安卓.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5786) at 安卓.view.Choreographer$CallbackRecord.run(Choreographer.java:767) at 安卓.view.Choreographer.doCallbacks(Choreographer.java:580) at 安卓.view.Choreographer.doFrame(Choreographer.java:550) at 安卓.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753) at 安卓.os.Handler.handleCallback(Handler.java:739) at 安卓.os.Handler.dispatchMessage(Handler.java:95) at 安卓.os.Looper.loop(Looper.java:135) at 安卓.app.ActivityThread.main(ActivityThread.java:5256) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.安卓.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:898) at com.安卓.internal.os.ZygoteInit.main(ZygoteInit.java:693)

public class AddTodoDialog extends AppCompatActivity {
    private static final String TAG_CLASS = AddTodoDialog.class.getSimpleName();

    AppCompatEditText _title, _desc;
    AppCompatTextView _date, _time;
    AppCompatCheckBox _isReminder;
    AppCompatSpinner _category, _priority;
    AppCompatButton _saveButton, _discardButton;
    ConstraintLayout _pickerLayout;

    String priority, category;
    boolean isDateSelected, isTimeSelected = false;
    ArrayList<String> categoryList = new ArrayList<>();
    ArrayList<String> priorityList = new ArrayList<>();

    int yearSelected, monthSelected, daySelected, hourSelected, minuteSelected;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.add_todo_dialog);
        initializeViews();
        _pickerLayout.setVisibility(View.GONE);
        addCategoryToList();
        addPriorityToList();
        setAdapters();
        _isReminder.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
                if (compoundButton.isChecked()) {
                    _pickerLayout.setVisibility(View.VISIBLE);
                } else _pickerLayout.setVisibility(View.GONE);
            }
        });
        _priority.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
                if (i > 0) {
                    priority = adapterView.getItemAtPosition(i).toString();
                    Messages.snackbar(view, "Priority Selected: " + priority, "");
                }
            }

            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {
                Messages.toastMessage(getApplicationContext(), "Please select a Priority.", "");
            }
        });
        _category.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
                if (i > 0) {
                    category = adapterView.getItemAtPosition(i).toString();
                    Messages.snackbar(view, "Category selected: " + category, "");
                }
            }

            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {
                Messages.toastMessage(getApplicationContext(), "Please select a Priority.", "");
            }
        });
        final DatePickerDialog.OnDateSetListener dateSetListener = new DatePickerDialog.OnDateSetListener() {
            @Override
            public void onDateSet(DatePicker datePicker, int year, int monthOfYear, int dayOfMonth) {
                isDateSelected = true;
                yearSelected = year;
                monthSelected = monthOfYear;
                daySelected = dayOfMonth;
                isDateSelected = true;
                _date.setText(String.valueOf(dayOfMonth + "-" + monthOfYear + "-" + year));
            }
        };
        _date.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Calendar calendar = Calendar.getInstance();
                new DatePickerDialog(AddTodoDialog.this, dateSetListener,
                        calendar.get(Calendar.YEAR),
                        calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH));
            }
        });
        final TimePickerDialog.OnTimeSetListener timeSetListener = new
                TimePickerDialog.OnTimeSetListener() {
                    @Override
                    public void onTimeSet(TimePicker timePicker, int hour, int minute) {
                        isTimeSelected = true;
                        hourSelected = hour;
                        minuteSelected = minute;
                        _time.setText(String.valueOf(hour + ":" + minute));
                    }
                };
        _time.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Calendar calendar = Calendar.getInstance();
                new TimePickerDialog(AddTodoDialog.this, timeSetListener,
                        calendar.get(Calendar.HOUR),
                        calendar.get(Calendar.MINUTE), true);
            }
        });
        _saveButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (_isReminder.isChecked()) {
                    if (!_date.getText().toString().equalsIgnoreCase("") &&
                            !_time.getText().toString().equalsIgnoreCase("") &&
                            !category.equalsIgnoreCase("") &&
                            !priority.equalsIgnoreCase("")) {
                        saveReminder(true);
                    } else {
                        Messages.toastMessage(getApplicationContext(),
                                "Please select a date and time.", "");
                    }
                } else if (!category.equalsIgnoreCase("") &&
                        !priority.equalsIgnoreCase("")) {
                    saveReminder(false);
                } else {
                    Messages.toastMessage(getApplicationContext(),
                            "Please select all the fields.", "");
                }
            }
        });
        _discardButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                finishActivity(false);
            }
        });
    }

    private void initializeViews() {
        _title = findViewById(R.id.todoTitleEnter);
        _desc = findViewById(R.id.todoDescEnter);
        _isReminder = findViewById(R.id.isReminder);
        _date = findViewById(R.id.date);
        _time = findViewById(R.id.time);
        _category = findViewById(R.id.categoryEnter);
        _priority = findViewById(R.id.priorityEnter);
        _saveButton = findViewById(R.id.saveButton);
        _discardButton = findViewById(R.id.discardButton);
        _pickerLayout = findViewById(R.id.showPicker);
    }

    /**
     * This is the method to set all the categories to the Array List.
     */
    private void addCategoryToList() {
        JSONArray categories = Constants.databaseController.getAllCategories();
        categoryList.add("Categories:");//Add the heading.
        try {
            for (int i = 0; i < categories.length(); i++) {
                JSONObject category = categories.getJSONObject(i);
                categoryList.add(category.getString(Constants.CATEGORY_TABLE_DESC));
            }
        } catch (JSONException e) {
            Messages.logMessage(TAG_CLASS, e.toString());
        }
    }

    /**
     * This is the method to add the Priority to the list.
     */
    private void addPriorityToList() {
        priorityList.add("Priority:");//Adding the first heading.
        for (int i = 0; i < 5; i++) {
            priorityList.add(String.valueOf(i + 1));
        }
    }

    /**
     * Method to set the adapters for the spinners.
     */
    private void setAdapters() {
        ArrayAdapter<String> categoryAdapter = new ArrayAdapter<String>(this,
                R.layout.spinner_item, R.id.categoryEnter, categoryList) {
            @Override
            public boolean isEnabled(int position) {
                if (position == 0)
                    return false;
                return true;
            }

            @Override
            public View getDropDownView(int position, @Nullable View convertView,
                                        @NonNull ViewGroup parent) {
                View view1 = getDropDownView(position, convertView, parent);
                AppCompatTextView textView = (AppCompatTextView) view1;
                if (position == 0)
                    textView.setTextColor(Color.GRAY);
                else
                    textView.setTextColor(Color.BLACK);
                return view1;
            }
        };
        categoryAdapter.setDropDownViewResource(R.layout.spinner_item);
        _category.setAdapter(categoryAdapter);
        ArrayAdapter<String> priorityAdapter = new ArrayAdapter<String>(this,
                R.layout.spinner_item, R.id.priorityEnter, priorityList) {
            @Override
            public boolean isEnabled(int position) {
                if (position == 0)
                    return false;
                return true;
            }

            @Override
            public View getDropDownView(int position, @Nullable View convertView,
                                        @NonNull ViewGroup parent) {
                View view = getDropDownView(position, convertView, parent);
                AppCompatTextView textView = (AppCompatTextView) view;
                if (position == 0)
                    textView.setTextColor(Color.GRAY);
                else
                    textView.setTextColor(Color.BLACK);
                return view;
            }
        };
        priorityAdapter.setDropDownViewResource(R.layout.spinner_item);
        _priority.setAdapter(priorityAdapter);
    }

    /**
     * Method to insert data to Database and save the reminder.
     *
     * @param isReminder: true, if there will be a notification, else false.
     */
    private void saveReminder(boolean isReminder) {
        try {
            String title = _title.getText().toString();
            String desc = _desc.getText().toString();
            int categoryId = Constants.databaseController.getCategoryID(category)
                    .getInt(Constants.CATEGORY_TABLE_ID);
            ContentValues values = new ContentValues();
            values.put(Constants.TODO_TABLE_TITLE, title);
            values.put(Constants.TODO_TABLE_DESC, desc);
            values.put(Constants.TODO_TABLE_PRIOROTY, Integer.valueOf(priority));
            values.put(Constants.TODO_TABLE_CATEGORYID, categoryId);
            if (isReminder) {
                Calendar calendar = Calendar.getInstance();
                calendar.set(yearSelected, monthSelected, daySelected, hourSelected, minuteSelected);
                long reminderTime = calendar.getTimeInMillis();
                values.put(Constants.TODO_TABLE_TIME_MILIS, reminderTime);
            } else {
                values.put(Constants.TODO_TABLE_TIME_MILIS, 0);
            }
            if (Constants.databaseController.insertDataTodo(values) < 0) {
                Messages.toastMessage(getApplicationContext(), "Couldn't save Reminder.", "");
                finishActivity(false);
                return;
            }
            Messages.toastMessage(getApplicationContext(), "Reminder saved.", "");
            finishActivity(true);
        } catch (NullPointerException | JSONException e) {
            Messages.logMessage(TAG_CLASS, e.toString());
            Messages.toastMessage(getApplicationContext(), "Couldn't save Reminder.", "");
            finishActivity(false);
        }
    }

    /**
     * Method to complete and close the dialog.
     *
     * @param isReminderSet: TRUE, if the reminder is set by the user, else false.
     */
    private void finishActivity(boolean isReminderSet) {
        Intent returnIntent = new Intent();
        if (isReminderSet)
            setResult(RESULT_OK, returnIntent);
        else {
            setResult(RESULT_CANCELED, returnIntent);
        }
        finish();
    }
}

这是布局文件:

<?xml version="1.0" encoding="utf-8"?>
<安卓.support.constraint.ConstraintLayout xmlns:安卓="http://schemas.安卓.com/apk/res/安卓"
    xmlns:app="http://schemas.安卓.com/apk/res-auto"
    xmlns:tools="http://schemas.安卓.com/tools"
    安卓:layout_width="match_parent"
    安卓:layout_height="wrap_content"
    安卓:background="#fcfcfc">

    <安卓.support.v7.widget.AppCompatEditText
        安卓:id="@+id/todoTitleEnter"
        安卓:textColor="#000000"
        安卓:layout_width="match_parent"
        安卓:layout_height="wrap_content"
        安卓:layout_marginEnd="8dp"
        安卓:layout_marginStart="8dp"
        安卓:layout_marginTop="8dp"
        安卓:hint="@string/title_todo"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <安卓.support.v7.widget.AppCompatEditText
        安卓:id="@+id/todoDescEnter"
        安卓:textColor="#000000"
        安卓:layout_width="match_parent"
        安卓:layout_height="wrap_content"
        安卓:layout_marginEnd="8dp"
        安卓:layout_marginStart="8dp"
        安卓:layout_marginTop="8dp"
        安卓:hint="@string/description_todo"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/todoTitleEnter" />

    <安卓.support.v7.widget.AppCompatCheckBox
        安卓:id="@+id/isReminder"
        安卓:textColor="#000"
        安卓:layout_width="match_parent"
        安卓:layout_height="wrap_content"
        安卓:layout_marginEnd="8dp"
        安卓:layout_marginStart="8dp"
        安卓:layout_marginTop="8dp"
        安卓:text="@string/add_reminder"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/todoDescEnter" />

    <安卓.support.constraint.ConstraintLayout
        安卓:id="@+id/showPicker"
        安卓:layout_width="match_parent"
        安卓:layout_height="wrap_content"
        tools:layout_editor_absoluteX="16dp"
        tools:layout_editor_absoluteY="166dp"
        app:layout_constraintTop_toBottomOf="@id/isReminder"
        app:layout_constraintStart_toEndOf="parent">

        <安卓.support.v7.widget.AppCompatTextView
            安卓:id="@+id/date"
            安卓:textColor="#000000"
            安卓:layout_width="wrap_content"
            安卓:layout_height="30dp"
            安卓:layout_marginEnd="8dp"
            安卓:layout_marginStart="8dp"
            安卓:layout_marginTop="8dp"
            安卓:hint="@string/select_date"
            app:layout_constraintEnd_toStartOf="@+id/time"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <安卓.support.v7.widget.AppCompatTextView
            安卓:id="@+id/time"
            安卓:textColor="#000000"
            安卓:layout_width="wrap_content"
            安卓:layout_height="30dp"
            安卓:layout_marginEnd="76dp"
            安卓:layout_marginTop="8dp"
            安卓:hint="@string/select_time"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    </安卓.support.constraint.ConstraintLayout>

    <安卓.support.v7.widget.AppCompatSpinner
        安卓:id="@+id/categoryEnter"
        安卓:layout_width="wrap_content"
        安卓:layout_height="wrap_content"
        安卓:layout_marginStart="68dp"
        安卓:layout_marginTop="20dp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/showPicker"/>

    <安卓.support.v7.widget.AppCompatSpinner
        安卓:id="@+id/priorityEnter"
        安卓:layout_width="wrap_content"
        安卓:layout_height="wrap_content"
        安卓:layout_marginEnd="56dp"
        安卓:layout_marginStart="8dp"
        安卓:layout_marginTop="20dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.72"
        app:layout_constraintStart_toEndOf="@+id/categoryEnter"
        app:layout_constraintTop_toBottomOf="@+id/showPicker" />

    <安卓.support.v7.widget.AppCompatButton
        安卓:id="@+id/discardButton"
        安卓:layout_width="wrap_content"
        安卓:layout_height="wrap_content"
        安卓:layout_marginBottom="8dp"
        安卓:layout_marginStart="56dp"
        安卓:layout_marginTop="24dp"
        安卓:background="@drawable/circle_button"
        安卓:text="@string/discard"
        安卓:textColor="#000000"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/categoryEnter"
        app:layout_constraintVertical_bias="1.0" />

    <安卓.support.v7.widget.AppCompatButton
        安卓:id="@+id/saveButton"
        安卓:layout_width="wrap_content"
        安卓:layout_height="wrap_content"
        安卓:layout_marginBottom="8dp"
        安卓:layout_marginEnd="8dp"
        安卓:layout_marginStart="8dp"
        安卓:layout_marginTop="28dp"
        安卓:background="@drawable/circle_button"
        安卓:text="@string/save_todo"
        安卓:textColor="#000000"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.47"
        app:layout_constraintStart_toEndOf="@+id/discardButton"
        app:layout_constraintTop_toBottomOf="@+id/priorityEnter"
        app:layout_constraintVertical_bias="0.0" />
</安卓.support.constraint.ConstraintLayout>

UPDATE: Found the answer. Solved the problem.

问题是微调器项的根元素

旧微调器\u项目布局:

<?xml version="1.0" encoding="utf-8"?>
<安卓.support.constraint.ConstraintLayout xmlns:安卓="http://schemas.安卓.com/apk/res/安卓"
    安卓:layout_width="match_parent"
    安卓:layout_height="match_parent"
    xmlns:tools="http://schemas.安卓.com/tools">
    <安卓.support.v7.widget.AppCompatTextView
        安卓:layout_width="match_parent"
        安卓:layout_height="wrap_content"
        安卓:id="@+id/spinnerItem"
        安卓:fontFamily="sans-serif-condensed"
        tools:text="Household"
        安卓:textStyle="bold"
        安卓:textSize="18sp"
        安卓:textAlignment="center"/>
</安卓.support.constraint.ConstraintLayout>

新微调器项布局

<?xml version="1.0" encoding="utf-8"?>
<安卓.support.v7.widget.AppCompatTextView xmlns:安卓="http://schemas.安卓.com/apk/res/安卓"
    安卓:layout_width="match_parent"
    安卓:layout_height="wrap_content"
    xmlns:tools="http://schemas.安卓.com/tools"
    安卓:id="@+id/spinnerItem"
    安卓:fontFamily="sans-serif-smallcaps"
    tools:text="Household"
    安卓:gravity="center"
    安卓:padding="15dp"
    安卓:textSize="20sp"
    安卓:textColor="#000"
    安卓:textStyle="bold"/>

共 (1) 个答案

  1. # 1 楼答案

    微调器项的根元素不应该是布局,它应该只包含小部件