NullPointerException в проблеме фрагмента - PullRequest
0 голосов
/ 29 ноября 2018

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

Я хочу использовать Edittextи кнопка, которая делает что-то с этим текстом редактирования.Вот мой код в frag_main.xml:

<android.support.design.widget.TextInputLayout
    android:id="@+id/text_input_email"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:errorEnabled="true">

    <android.support.design.widget.TextInputEditText
        android:id="@+id/email_input"
        android:layout_height="wrap_content"
        android:layout_width="match_parent"
        android:hint="Email"
        android:inputType="textEmailAddress"/>

</android.support.design.widget.TextInputLayout>

<Button
    android:id="@+id/send_email_button"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Send"/>

И мой код в MainFragment.java:

import ...
public class MainFragment extends Fragment {

private TextInputLayout textInputEmail;

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

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_main, container, false);

    textInputEmail = (TextInputLayout) view.findViewById(R.id.text_input_email);

    Button send_button = (Button) view.findViewById(R.id.send_email_button);
    send_button.setOnClickListener(view -> buttonSend(view));

    return view;
}

private boolean validateEmail() {
    String emailInput = textInputEmail.getEditText().getText().toString().trim();

    if (emailInput.isEmpty()) {
        textInputEmail.setError("Field can't be empty!");
        return false;
    } else {
        textInputEmail.setError(null);
        return true;
    }
}

public void buttonSend(View v) {
    if (!validateEmail() ) {
        return;
    }

    /*do something*/
}
}

Для этого я не получаю никаких ошибок ни в одном из моих кодов, поэтому яне понимаю, в чем проблема.Предупреждение, которое я получаю в MainActivity.java «getText», может вызвать «java.lang.NullPointerException» точно в части .getText () в методе validateEmail ().

Надеюсь, я хорошо это объяснил,Спасибо всем, кто пытается помочь!

РЕДАКТИРОВАТЬ: Я считаю, что я не объяснил это достаточно хорошо.Я забыл сказать, что когда я нажимаю кнопку «Отправить», мое приложение мгновенно падает.Это проблема, которую я пытаюсь решить.

РЕДАКТИРОВАТЬ 2: Вот то, что я считаю "трассировкой стека".

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.luka.straingeremailapp, PID: 2728
java.lang.IllegalStateException: Could not find method buttonSend(View) in a parent or ancestor Context for android:onClick attribute defined on view class android.support.v7.widget.AppCompatButton
    at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.resolveMethod(AppCompatViewInflater.java:424)
    at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:381)
    at android.view.View.performClick(View.java:6291)
    at android.view.View$PerformClick.run(View.java:24931)
    at android.os.Handler.handleCallback(Handler.java:808)
    at android.os.Handler.dispatchMessage(Handler.java:101)
    at android.os.Looper.loop(Looper.java:166)
    at android.app.ActivityThread.main(ActivityThread.java:7425)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921)

Ответы [ 4 ]

0 голосов
/ 29 ноября 2018

Проблема в том, что вы кастуете:

  textInputEmail = (TextInputLayout) view.findViewById(R.id.text_input_email);

использование:

  textInputEmail = (TextInputEditText) view.findViewById(R.id.text_input_email);
0 голосов
/ 29 ноября 2018

Для сбоя:

Это вызвано тем, что атрибут android:onClick работает только тогда, когда метод объявлен в Activity, а не в Fragment.Я бы порекомендовал никогда не использовать атрибут android:onClick.

Вместо этого разрешите Button в onCreateView точно так же, как вы для TextInputLayout, и вручную наберите button.setOnClickListener(view -> buttonSend(view));, чтобы назначить прослушиватель щелчков.

Дляпредупреждение:

Это потому, что TextInputLayout объявляет свой метод getEditText() как @Nullable (это означает, что он не гарантирует, что вы получите ненулевое значение при его вызове).

Причина этого в том, что TextInputLayout присваивает свой внутренний EditText после инфляции (TextInputEditText, который вы объявили в своем XML-макете).

Если вы не включили этот TextInputEditText как дочерний элемент TextInputLayout, то getEditText() вернет ноль.В вашем случае вы можете гарантировать, что если вы не измените этот макет, вы получите правильное значение, поэтому вы можете сделать это утверждение, чтобы избежать предупреждения:

EditText editText = Objects.requireNonNull(textInputEmail.getEditText());
String emailInput = editText.getText().toString().trim();
0 голосов
/ 29 ноября 2018

Если вы уверены, что ваш код верен, просто конвертируйте ваш проект в проект Kotlin. Android-студия сделает это за вас. Исключением будет история

0 голосов
/ 29 ноября 2018

На самом деле это не ошибка, и вы обнаружите, что на самом деле это довольно распространенная ошибка.По сути, любой элемент пользовательского интерфейса, который напрямую не контролируется кодом (IE: что-то во фрагменте, используемом отдельным действием или элементами, определенными в адаптере списка.), Выдаст вам это предупреждение, потому что он не может гарантировать, что элемент пользовательского интерфейса существует и создается.
Вы можете добавить нулевую проверку вокруг .getText (), чтобы заставить предупреждение замолчать и предотвратить его попытку извлечь из элемента, если он действительно нулевой.

if(textInputEmail != null){
   String emailInput = textInputEmail.getEditText().getText().toString().trim();
}
...