2016-12-08 13 views
0

私はアンドロイドスタジオを使ってメッセージングアプリケーションを構築しました。このためにこのクラスをインポートしました。Androidスタジオに新しいメソッドが追加されましたロックされたクラス

import co.devcenter.androiduilibrary.ChatView; 

このクラスには、メッセージの送受信オプションがあります。受信メッセージメソッドでは、現在の時刻をとり、メッセージを受信します。さて、私はこのメッセージを保存し、それらをユーザーに見せたいと思います。問題は、このメッセージをユーザーに表示するには、このメッセージの時刻を格納するStoreMessagesのようなメソッドを記述する必要があります。ユーザーにこのメッセージを表示する場合は、時間をcompenentと同等にする必要があります。私はデータベース上の価値があります。しかし、私は受信メソッドを変更することができないので、常に現在の時間がかかります。どうすればこのクラスに新しい機能を追加できますか?

私は、私が作成した新しいJavaファイルにクラス全体をコピーしようとした私のプログラムは、これが興味を持ったもののログ猫のエラーですが、この質問の主な焦点は、私が尋ねたものを達成する方法である

を墜落。

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. 
+0

、私はそれを追加していますが、私の質問は、私はあなたが二つの異なる 'ChatView'クラスを持っている –

+0

にlogcatを追加します。あなたは他の人にキャストすることはできません。あなたは混乱を避けるために 'com.example.sahilliolu.myapplication.ChatView'の名前を変えるべきです – Prethia

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

      } 
     }); 
    } 

あるいは、あなたはあなた自身のサブクラス内でこれらのメソッドをオーバーライドすることができます。あなたはこのすべてのコードをコピーし、AN、それを修正しない場合

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を使用しない場合は、CustomChatViewChatViewにキャストできません。また、クラスを混在させることもできません。これがエラーの原因です。

アダプタクラスでも同様のことができます。

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); 
    } 
+0

これは私が継承について知っているから尋ねたことでしたが、 Androidスタジオでメッセージを追加すると思っていると思いますが、メッセージを受信して​​メッセージを送信するChatViewのメソッドで使用されます。時間情報もそのメソッドで与えられます。ところで私は自分のパッケージでそれをすることができますか? – Prethia

+0

ChatViewListAdapterにはコンストラクタがないので、私が提案したことはできません。私はそれを拡張できません。 – Prethia

+0

Android Studioは継承の理解を制限していません。それはすべてJavaだけです。私はあなたが参照しているものを参照してください...あなたは本質的にあなたが求めるものを得るために、このライブラリを書き直す必要があると私は思います –

関連する問題