Android 类未定义无参数构造函数。如果您使用的是ProGuard,请确保未剥离这些构造函数
我正在尝试在android studio上创建聊天应用程序。我的应用程序没有生成错误,我可以启动该应用程序。但是,当我使用Android 类未定义无参数构造函数。如果您使用的是ProGuard,请确保未剥离这些构造函数,android,chat,Android,Chat,我正在尝试在android studio上创建聊天应用程序。我的应用程序没有生成错误,我可以启动该应用程序。但是,当我使用listOfMessage.setAdapter(adapter)时我的应用程序正在崩溃。不过,它确实启动了应用程序,在我说1-2秒之后,它正在崩溃应用程序。在logcat上,我发现类没有定义无参数构造函数。如果您使用的是ProGuard,请确保这些构造函数没有删除错误消息。您能告诉我如何解决此问题吗 当我不使用listOfMessage.setAdapter(适配器)时,无
listOfMessage.setAdapter(adapter)时代码>我的应用程序正在崩溃。不过,它确实启动了应用程序,在我说1-2秒之后,它正在崩溃应用程序。在logcat
上,我发现类没有定义无参数构造函数。如果您使用的是ProGuard,请确保这些构造函数没有删除错误消息。
您能告诉我如何解决此问题吗
当我不使用listOfMessage.setAdapter(适配器)时
,无论我在应用程序上写下什么,都不会显示在列表视图上,但我看到条目在firebase上运行良好。代码如下:
public class MainActivity extends AppCompatActivity {
private static int SIGN_IN_REQUEST_CODE = 1;
private FirebaseListAdapter<ChatMessage> adapter;
RelativeLayout activity_main;
FloatingActionButton sendButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
activity_main =(RelativeLayout)findViewById(R.id.activiy_main);
sendButton = (FloatingActionButton) findViewById(R.id.sendButton);
sendButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
EditText input = (EditText)findViewById(R.id.input);
FirebaseDatabase.getInstance().getReference().push().setValue(new ChatMessage(input.getText().toString(),
FirebaseAuth.getInstance().getCurrentUser().getEmail()));
input.setText("");
}
});
if(FirebaseAuth.getInstance().getCurrentUser() == null) {
startActivityForResult(AuthUI.getInstance().createSignInIntentBuilder().build(), SIGN_IN_REQUEST_CODE);
}
else
{
Snackbar.make(activity_main,"Welcome "+FirebaseAuth.getInstance().getCurrentUser().getEmail(),Snackbar.LENGTH_SHORT).show();
displayChatMessage();
}
}
private void displayChatMessage() {
ListView listOfMessage = (ListView)findViewById(R.id.list_of_message);
adapter = new FirebaseListAdapter<ChatMessage>(this,ChatMessage.class,R.layout.list_item,FirebaseDatabase.getInstance().getReference())
{
@Override
protected void populateView(View v, ChatMessage model, int position) {
TextView messageText, messageUser,messageTime;
messageText = (TextView)v.findViewById(R.id.message_text);
messageUser = (TextView)v.findViewById(R.id.message_user);
messageTime = (TextView)v.findViewById(R.id.message_time);
messageText.setText(model.getMessageText());
messageUser.setText(model.getMessageText());
messageTime.setText(DateFormat.format("dd-MM-yyyy (HH:mm:ss)",model.getMessageTime()));
}
};
//BELOW ONE NEEDS TO BE ACTIVE...TO MAKE ENTRIES VISIBLE
//listOfMessage.setAdapter(adapter);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == SIGN_IN_REQUEST_CODE)
{
if(resultCode == RESULT_OK)
{
Snackbar.make(activity_main, "Successfully signed in. Welcome !", Snackbar.LENGTH_SHORT).show();
displayChatMessage();
}
else {
Snackbar.make(activity_main, "we couldn't sign you in. Please try again", Snackbar.LENGTH_SHORT).show();
finish();
}
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if(item.getItemId() == R.id.menu_sign_out)
{
AuthUI.getInstance().signOut(this).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
Snackbar.make(activity_main,"You have been signed out..", Snackbar.LENGTH_SHORT).show();
finish();
}
});
}
return true;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main_menu,menu);
return true;
}
}
logcat上出现完全错误
:
com.google.firebase.database.DatabaseException: Class com.example.cagrik.chat.ChatMessage does not define a no-argument constructor. If you are using ProGuard, make sure these constructors are not stripped.
at com.google.android.gms.internal.firebase_database.zzku.zza(Unknown Source:44)
at com.google.android.gms.internal.firebase_database.zzkt.zzb(Unknown Source:196)
at com.google.android.gms.internal.firebase_database.zzkt.zza(Unknown Source:0)
at com.google.firebase.database.DataSnapshot.getValue(Unknown Source:10)
at com.firebase.ui.database.FirebaseListAdapter.parseSnapshot(FirebaseListAdapter.java:120)
at com.firebase.ui.database.FirebaseListAdapter.getItem(FirebaseListAdapter.java:109)
at com.firebase.ui.database.FirebaseListAdapter.getView(FirebaseListAdapter.java:137)
at android.widget.AbsListView.obtainView(AbsListView.java:3189)
at android.widget.ListView.makeAndAddView(ListView.java:2197)
at android.widget.ListView.fillDown(ListView.java:824)
at android.widget.ListView.fillFromTop(ListView.java:885)
at android.widget.ListView.layoutChildren(ListView.java:1924)
at android.widget.AbsListView.onLayout(AbsListView.java:2961)
at android.view.View.layout(View.java:20854)
at android.view.ViewGroup.layout(ViewGroup.java:6401)
at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1080)
at android.view.View.layout(View.java:20854)
at android.view.ViewGroup.layout(ViewGroup.java:6401)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
at android.view.View.layout(View.java:20854)
at android.view.ViewGroup.layout(ViewGroup.java:6401)
at android.support.v7.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:443)
at android.view.View.layout(View.java:20854)
at android.view.ViewGroup.layout(ViewGroup.java:6401)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
at android.view.View.layout(View.java:20854)
at android.view.ViewGroup.layout(ViewGroup.java:6401)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1791)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1635)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1544)
at android.view.View.layout(View.java:20854)
at android.view.ViewGroup.layout(ViewGroup.java:6401)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
at com.android.internal.policy.DecorView.onLayout(DecorView.java:945)
at android.view.View.layout(View.java:20854)
at android.view.ViewGroup.layout(ViewGroup.java:6401)
at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2956)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2643)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1780)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7827)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:911)
at android.view.Choreographer.doCallbacks(Choreographer.java:723)
at android.view.Choreographer.doFrame(Choreographer.java:658)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:897)
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)
我只是错过了:
public ChatMessage(){}
关于我的ChatMessage.class
-感谢@Michael为我找到解决方案。如果您使用的是内部类,您也可以获得该消息。然后最好是将该内部类提取到它自己的文件中,在本例中:ChatMessage.java在声明所有变量(即
public ChatMessage() { }
Kotlin的解决方案
您需要放置辅助构造函数
public ChatMessage(){}
在ChatMessage.kt中添加以下代码
constructor(
messageText: String,
messageUser: String,
messageUserId: String) {
this.messageText = messageText
this.messageUser = messageUser
messageTime = Date().getTime()
this.messageUserId = messageUserId
}
constructor() // **Add this**
我也犯了同样的错误,我忘记了构造函数:
public ChatMessage() { }
您必须添加一个默认构造函数:
public ChatMessage(){}
在kotlin代码的数据类中添加一个默认参数,并将每个参数设置为null。例如
数据类消息(val名称:String?=null,val用户名:String?=null)
只需添加此构造函数即可
public ChatMessage(){}
这已经晚了,但可能会在将来帮助别人
Kotlin
**change your from**
data class ChatMessage(
var messageText: String?,
var messageUser: String?,
var messageTime: Long?)
到此
data class ChatMessage(
var messageText: String? = "",
var messageUser: String? = "",
var messageTime: Long? = 0)
“i'm getting类未定义无参数构造函数”。哪一班?请发布完整的堆栈跟踪。@Michael com.google.firebase.database.DatabaseException:Class com.example.cagrik.chat.ChatMessage未定义无参数构造函数。如果您使用的是ProGuard,请确保com.google.android.gms.internal.firebase_database.zzku.zza(未知源代码:44)com.google.android.gms.internal.firebase_database.zzkt.zzb(未知源代码:196)com.google.android.gms.internal.firebase_database.zzkt.zz(未知源代码:0)上没有剥离这些构造函数位于com.firebase.ui.database.database.DataSnapshot.getValue(未知来源:10)位于com.firebase.ui.database.FirebaseListAdapter.parseSnapshot(FirebaseListAdapter.java:120)位于com.firebase.ui.database.FirebaseListAdapter.getItem(FirebaseListAdapter.java:109)位于com.FirebaseListAdapter.ui.database.FirebaseListAdapter.java:137)通过编辑,在你的问题中以正确的格式发布。另外,ChatMessage
类的代码在哪里,因为这就是错误所指的?正如错误消息所说,您的ChatMessage
类没有无参数构造函数。所以你需要添加一个。我不理解你的解决方案,因为在你的问题代码中你已经有了ChatMessage构造函数???如果我在数据类中这样做呢?