невозможно получить ввод текста из библиотеки материалов TextInputEditText - PullRequest
0 голосов
/ 05 марта 2020

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

<?xml version="1.0" encoding="utf-8"?>
<ScrollView 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="@color/loginPageBackgroundColor"
    tools:context=".Authentication.LoginFragment">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:clipChildren="false"
        android:clipToPadding="false"
        android:orientation="vertical"
        android:padding="24dp"
        android:paddingTop="16dp">

        <ImageView
            android:layout_width="64dp"
            android:layout_height="64dp"
            android:layout_gravity="center_horizontal"
            android:layout_marginTop="48dp"
            android:layout_marginBottom="16dp"
            android:tint="?android:attr/textColorPrimary"
            app:srcCompat="@drawable/shr_logo" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:layout_marginBottom="132dp"
            android:text="@string/login_logo_text"
            android:textAppearance="@style/TextAppearance.homayoun.Title"
            android:textSize="16sp" />

        <com.google.android.material.textfield.TextInputLayout
            android:id="@+id/username_text_input"
            style="@style/Widget.homayoun.TextInputLayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="4dp"
            android:hint="@string/username_hint">

            <com.google.android.material.textfield.TextInputEditText
                android:id="@+id/username_edit_text"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:inputType="text"
                android:maxLines="1" />
        </com.google.android.material.textfield.TextInputLayout>

        <com.google.android.material.textfield.TextInputLayout
            android:id="@+id/password_text_input"
            style="@style/Widget.homayoun.TextInputLayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="4dp"
            android:hint="@string/password_hint"
            app:errorEnabled="true">

            <com.google.android.material.textfield.TextInputEditText
                android:id="@+id/password_edit_text"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:inputType="textPassword" />
        </com.google.android.material.textfield.TextInputLayout>

        <LinearLayout
            android:orientation="horizontal"
            android:layout_gravity="end"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">

            <com.google.android.material.button.MaterialButton
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/cancel_button"
                android:text="@string/cancel_text"
                style="@style/Widget.homayoun.Button.TextButton" />

            <com.google.android.material.button.MaterialButton
                android:layout_marginLeft="20dp"
                android:id="@+id/signup_button"
                style="@style/Widget.homayoun.Button"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/sign_up_button" />

        </LinearLayout>



    </LinearLayout>

</ScrollView>

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

package com.homayoun_rad.thisisfuckingmine.Authentication;

import android.content.ContentValues;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;

import androidx.fragment.app.Fragment;

import com.google.android.material.button.MaterialButton;
import com.homayoun_rad.thisisfuckingmine.Database.SqlOpenHelper;
import com.homayoun_rad.thisisfuckingmine.MainActivity;
import com.homayoun_rad.thisisfuckingmine.R;


/**
 * A simple {@link Fragment} subclass.
 */
public class SignupFragment extends Fragment {

    public SignupFragment() {
        // Required empty public constructor
    }

    private SqlOpenHelper sqlOpenHelper;

    @Override

    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_signup, container, false);

        // initializing database
        sqlOpenHelper = new SqlOpenHelper(getActivity());

        MaterialButton cancelButton = view.findViewById(R.id.cancel_button);
        cancelButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ((MainActivity) getActivity()).navigateTo(new LoginFragment(), false);
            }
        });

        MaterialButton signupButton = view.findViewById(R.id.signup_button);
        signupButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                databaseHandler(v);
                Toast.makeText(getContext(), "Account Created!", Toast.LENGTH_SHORT).show();
                ((MainActivity) getActivity()).navigateTo(new LoginFragment(), false);
            }
        });

        return view;
    }

    private void databaseHandler(@org.jetbrains.annotations.NotNull View view) {
        SQLiteDatabase sqLiteDatabase = sqlOpenHelper.getWritableDatabase();
        ContentValues contentValues = new ContentValues();

        MaterialButton usernameText = view.findViewById(R.id.username_text_input);
        MaterialButton passwordText = view.findViewById(R.id.password_text_input);

        String username = usernameText.getText().toString();
        String password = passwordText.getText().toString();

        contentValues.put(SqlOpenHelper.FeedEntry.USERNAME, username);
        contentValues.put(SqlOpenHelper.FeedEntry.PASSWORD, password);

        sqLiteDatabase.insert(SqlOpenHelper.FeedEntry.TABLE_NAME, null, contentValues);
    }
}

в вспомогательном методе базы данных. использование этого вызывает следующую ошибку:

2020-03-05 12:17:10.903 29223-29223/com.homayoun_rad.thisisfuckingmine E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.homayoun_rad.thisisfuckingmine, PID: 29223
    java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.CharSequence com.google.android.material.button.MaterialButton.getText()' on a null object reference
        at com.homayoun_rad.thisisfuckingmine.Authentication.SignupFragment.databaseHandler(SignupFragment.java:68)
        at com.homayoun_rad.thisisfuckingmine.Authentication.SignupFragment.access$000(SignupFragment.java:22)
        at com.homayoun_rad.thisisfuckingmine.Authentication.SignupFragment$2.onClick(SignupFragment.java:52)
        at android.view.View.performClick(View.java:6897)
        at android.widget.TextView.performClick(TextView.java:12693)
        at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:967)
        at android.view.View$PerformClick.run(View.java:26104)
        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:6944)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)

что я сделал не так? Как я должен получить входной текст из этого editText?

1 Ответ

2 голосов
/ 05 марта 2020

Вы передали неверный аргумент в databaseHandler(v);

Измените его

databaseHandler(view);

Вместо

databaseHandler(v);

Отредактировано:

Следующие строки Также неправильно, Вы назначаете TextInputLayout на Кнопка

 MaterialButton usernameText = view.findViewById(R.id.username_text_input);
 MaterialButton passwordText = view.findViewById(R.id.password_text_input);

Изменить ID и соответствующий тип, как показано ниже:

 TextInputEditText usernameText = view.findViewById(R.id.username_edit_text);
 TextInputEditText passwordText = view.findViewById(R.id.password_edit_text);

Надеюсь, что это будет работа.

...