Android工作室添加新方法锁定类

时间:2016-12-08 15:55:05

标签: android inheritance

我正在使用android studio构建一个消息传递应用程序,为此我导入了这个类。

import co.devcenter.androiduilibrary.ChatView;

在此课程中,有接收和发送消息选项。在接收消息方法中,它接收当前时间并接收消息。现在,我想存储此消息并将其显示给用户。问题是,为了向用户显示此消息,我需要能够编写一个像StoreMessages这样的方法来存储这些消息的时间,当我想向用户显示这些消息时,我需要让它的时间等于我对数据库的价值。但由于我无法更改接收方法,因此总是占用当前时间。那么如何在这个类中添加新功能呢?

我试图将整个类复制到我创建的新java文件中,程序崩溃了

这是感兴趣的人的日志cat错误,但这个问题的主要焦点是如何实现我的要求。

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.sahilliolu.myapplication/com.example.sahilliolu.myapplication.ChatActivity}: java.lang.ClassCastException: co.devcenter.androiduilibrary.ChatView cannot be cast to com.example.sahilliolu.myapplication.ChatView
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2665)
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726)
                      at android.app.ActivityThread.-wrap12(ActivityThread.java)
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477)
                      at android.os.Handler.dispatchMessage(Handler.java:102)
                      at android.os.Looper.loop(Looper.java:154)
                      at android.app.ActivityThread.main(ActivityThread.java:6119)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
                   Caused by: java.lang.ClassCastException: co.devcenter.androiduilibrary.ChatView cannot be cast to com.example.sahilliolu.myapplication.ChatView
                      at com.example.sahilliolu.myapplication.ChatActivity.onCreate(ChatActivity.java:38)
                      at android.app.Activity.performCreate(Activity.java:6679)
                      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2618)
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726) 
                      at android.app.ActivityThread.-wrap12(ActivityThread.java) 
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477) 
                      at android.os.Handler.dispatchMessage(Handler.java:102) 
                      at android.os.Looper.loop(Looper.java:154) 
                      at android.app.ActivityThread.main(ActivityThread.java:6119) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 
Application terminated.

1 个答案:

答案 0 :(得分:1)

如果您尝试向库中添加功能,则最好使用继承,而只是复制整个文件。

但是,在代码紧密耦合的情况下(我假设我找到了正确的库),那么你需要做一些额外的工作。

public class YourChatView extends View {

    // This is your own adapter. 
    private MyChatViewListAdapter adapter;

    ... 

    public MyChatView(Context context) {
        this(context, null); 
    }

    public ChatView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public ChatView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context, attrs, defStyleAttr);
    }

    private void init(Context context, AttributeSet attrs, int defStyleAttr) {

        ...

        // You'd have to replace these with your own adapter
        adapter = new MyChatViewListAdapter(context);
        chatListView.setAdapter(adapter);
    }

    ... 

    // Make this insert the timestamp you want
    private void setButtonOnClickListener() {
        sendButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                long stamp = System.currentTimeMillis();
                String message = inputEditText.getText().toString();
                if (!TextUtils.isEmpty(message)) {
                    sendMessage(message, stamp);
                }

            }
        });
    }

或者,如果您在完全交换该功能时遇到问题,则可以在您自己的子类中覆盖这些方法,因为它们是公开的。

public void sendMessage(String message, long stamp) {
    ChatMessage chatMessage = new ChatMessage(message, stamp, Type.SENT);
    if (chatListener != null && chatListener.sendMessage(message, stamp)) {
        chatViewListAdapter.addMessage(chatMessage);
        inputEditText.setText("");
    }
}

public void newMessage(String message) {
    ChatMessage chatMessage = new ChatMessage(message, System.currentTimeMillis(), Type.RECEIVED);
    chatViewListAdapter.addMessage(chatMessage);
    notifyMessageReceivedListener(chatMessage);
}

public void newMessage(ChatMessage chatMessage) {
    chatViewListAdapter.addMessage(chatMessage);
    notifyMessageReceivedListener(chatMessage);
}

如果你复制了所有这些代码并进行了修改,那么请务必在活动代码中使用CustomChatView而不是ChatView。如果您不使用extends,则无法将CustomChatView转换为ChatView,也不能混合使用类,这就是错误所说的内容。

您可以使用适配器类执行类似的操作。

public class ChatViewListAdapter extends BaseAdapter {

    ...

    public void addMessage(ChatMessage message) {
        chatMessages.add(message);
        notifyDataSetChanged();
    }

只需展开ChatViewListAdapter,并覆盖addMessage方法即可执行任何操作。

public class MyChatViewListAdapter extends ChatViewListAdapter {

    ...

    @Override
    public void addMessage(ChatMessage message) {
        message.setTimestamp(0L); // Update to the time you want. 
        super.addMessage(message);
    }