web-dev-qa-db-fra.com

La classe ne définit pas de constructeur sans argument. Si vous utilisez ProGuard, assurez-vous que ces constructeurs ne sont pas supprimés

J'essaie de créer une application de chat sur Android studio. Mon application n'a pas d'erreur de construction et je peux démarrer l'application. Cependant, lorsque j'utilise listOfMessage.setAdapter(adapter); mon application plante . il démarre l'application cependant, après je dirais 1-2 secondes, elle plante de l'application. sur logcat, je reçois Class does not define a no-argument constructor. If you are using ProGuard, make sure these constructors are not stripped error message. pouvez-vous s'il vous plaît me conseiller comment résoudre ce problème?

Quand je n'utilise pas listOfMessage.setAdapter(adapter);, tout ce que j'écris sur l'application n'apparaît pas sur listview, mais je vois que les entrées passent bien par firebase. code ci-dessous:

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;
}

}

et ChatMessage.class ci-dessous:

public class ChatMessage {

    private String messageText;
    private String messageUser;
    private  long messageTime;

    public ChatMessage(String messageText, String messageUser) {
        this.messageText = messageText;
        this.messageUser = messageUser;

        messageTime = new Date().getTime();
    }

    public ChatMessage(String messageText) {
        this.messageText = messageText;
    }

    public String getMessageText() {
        return messageText;
    }

    public void setMessageText(String messageText) {
        this.messageText = messageText;
    }

    public String getMessageUser() {
        return messageUser;
    }

    public void setMessageUser(String messageUser) {
        this.messageUser = messageUser;
    }

    public long getMessageTime() {
        return messageTime;
    }

    public void setMessageTime(long messageTime) {
        this.messageTime = messageTime;
    }
}

Erreur complète sur 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)
5
Cagri Karabulut

Je manquais tout simplement:

public ChatMessage(){} sur mon ChatMessage.class - merci @Michael de m'avoir trouvé la solution.

4
Cagri Karabulut

Vous pouvez également obtenir ce message si vous utilisez une classe interne. Le mieux serait alors d'extraire cette classe interne dans son propre fichier, dans ce cas: ChatMessage.Java

2
dreinoso