片段问题中的NullPointerException



在过去的几个小时里,我一直在努力寻找问题的答案,但在尝试了不同的方法后,我无法解决问题。

我想要的是使用一个Edittext和一个对该Edittext执行某些操作的按钮。这是我在fragment_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"可能会在validateEmail((方法的.getText((部分产生"java.lang.NullPointerException"。

希望我解释得好。感谢任何试图提供帮助的人!

编辑:我认为我没有很好地解释它。我忘了说,当我按下"发送"按钮时,我的应用程序会立即崩溃。这就是我正在努力解决的问题。

编辑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)

对于崩溃:

这是因为android:onClick属性仅在方法在Activity上声明而不是在Fragment上声明时才起作用。我建议永远不要使用android:onClick属性。

相反,在onCreateView中解析Button,就像解析TextInputLayout一样,然后手动调用button.setOnClickListener(view -> buttonSend(view));来分配点击侦听器。

警告:

这是因为TextInputLayout将其getEditText()方法声明为@Nullable(这意味着它不保证在调用它时会得到一个非null值(。

原因是TextInputLayout在膨胀后分配其内部EditText(您在XML布局中声明的TextInputEditText(。

若并没有将TextInputEditText作为TextInputLayout的子级包含,那个么getEditText()将返回null。在你的情况下,你可以保证,除非你改变布局,否则你会得到正确的值,所以你可以做的是做出断言来避免警告:

EditText editText = Objects.requireNonNull(textInputEmail.getEditText());
String emailInput = editText.getText().toString().trim();

这并不是一个真正的错误,您会发现它实际上很常见。基本上,任何不受代码直接控制的ui元素(IE:单独活动使用的片段中的东西,或列表适配器中定义的元素。(都会向您发出此警告,因为它不能保证ui元素存在并实例化
您可以在.getText((周围添加一个null检查,以使警告静音,并防止它在确实为null的情况下试图从元素中提取。

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

如果您确信您的代码是正确的,那么只需将您的项目转换为Kotlin项目安卓工作室会为你做这件事然后异常将成为历史

问题是因为您正在铸造:

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

用途:

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

相关内容

最新更新