如何解决数据绑定对象设置内容视图,但实际上为空
所以,我正在尝试将 dataBinding 添加到我的应用程序中,它在早期的应用程序中运行良好,但在这里它似乎不起作用。 这是代码。 选择Activity.java
package com.example.BoardsRevision;
import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import com.example.BoardsRevision.databinding.ActivitySelectBinding;
public class SelectActivity extends AppCompatActivity {
private ActivitySelectBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = DataBindingUtil.setContentView(this,R.layout.activity_select);
if(binding==null) {
Log.d("meraTAG","onCreate: Binding is null" );
}
// if(getIntent().getStringExtra("name")!=null){
// String name = getIntent().getStringExtra("name");
// Log.d("username","onCreate: " + name);
// }
//
// binding.buttonTrivia.setOnClickListener(v -> {
// startActivity(new Intent(SelectActivity.this,TriviaActivity.class));
// });
}
}``
activity_select.xml
<?xml version="1.0" encoding="utf-8"?>
<layout 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">
<data>
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/royal_purple"
tools:context=".SelectActivity">
<Button
android:id="@+id/buttonQuestions"
android:layout_width="0dp"
android:layout_height="60dp"
android:layout_margin="@dimen/extra_margin"
android:backgroundTint="@color/faded_orange"
android:text="@string/practice_questions"
android:textSize="18sp"
app:layout_constraintBottom_toTopOf="@+id/buttonCases"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.965" />
<Button
android:id="@+id/buttonCases"
android:layout_width="0dp"
android:layout_height="60dp"
android:layout_margin="@dimen/extra_margin"
android:backgroundTint="#FF913E"
android:text="@string/real_life_cases"
android:textSize="18sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/buttonTrivia"
android:layout_width="0dp"
android:layout_height="60dp"
android:layout_margin="@dimen/extra_margin"
android:backgroundTint="#FF913E"
android:text="@string/trivia"
android:textSize="18sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/buttonCases"
app:layout_constraintVertical_bias="0.035" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
我已经在 activity_select.xml 文件中添加了布局标签并且 我试过使用 binding = ActivitySelectBinding.inflate() 但是当我尝试使用 buttonTrivia 时它总是调用一个空指针异常..所以我添加了 if 语句来查看绑定本身是否为空..确实如此。 if 语句为真.. 我可以在日志中看到它。
有趣的是,正在设置视图,但是一旦我尝试使用绑定对象访问任何视图,应用程序就会崩溃。 这是“运行”选项卡上的内容
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.boardsrevision10,PID: 9007
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.boardsrevision10/com.example.BoardsRevision.SelectActivity}: java.lang.NullPointerException: Attempt to read from field 'android.widget.Button com.example.BoardsRevision.databinding.ActivitySelectBinding.buttonTrivia' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
Caused by: java.lang.NullPointerException: Attempt to read from field 'android.widget.Button com.example.BoardsRevision.databinding.ActivitySelectBinding.buttonTrivia' on a null object reference
at com.example.BoardsRevision.SelectActivity.onCreate(SelectActivity.java:32)
at android.app.Activity.performCreate(Activity.java:6662)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
解决方法
无需设置内容视图,因为它已经知道要膨胀的布局。
在IDE的“java”下面看到目录“java(generated)”,应该有一个生成的绑定。
@Override
public View onCreateView(@NonNull LayoutInflater inflater,@Nullable ViewGroup container,@Nullable Bundle savedInstanceState) {
this.mDataBinding = ActivitySelectBinding.inflate(inflater,container,false);
}
保留 R.layout.activity_select
只会让 IDE 知道要链接哪个 XML 文件:
private static final int resId = R.layout.activity_select;
,
我发现包名应该以小写开头..我不知道这是不是问题,但不知何故更改包名后一切似乎都正常。
其次,我认为使用
binding = ActivitySelectBinding.inflate(getLayoutInflater); setContentView(binding.getRoot());
也成功了
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。