2 kprf2009 KPRF2009 于 2012.11.29 10:30 提问

android 动态添加了button后,怎么给button设置监听器?

android 动态添加了button后,怎么给button设置监听器?

类似微信一样,我收到了语音消息,我在主界面上添加了一个按钮,这个按钮怎么添加监听器?点击后就可以播放我收到的那条消息。

我已经用listview动态添加item(是一个button)了,就是不知道每一个item怎么设置点击后播放不同的声音。。。

    private void send()
{

    if(flag==0)//发送的是文字
    {   
         sendContString = mEditTextContent.getText().toString();
        if (sendContString.length() > 0)
        {
            ChatMsgEntity entity = new ChatMsgEntity();
            entity.setDate(getDate());
            entity.setName("syskey");
            entity.setMsgType(false);
            entity.setText(sendContString);
            entity.setKind(1);

            mDataArrays.add(entity);

            new Thread(new Runnable() {

                @Override
                public void run() {
                    try {
                        new Client().send(ip, port,sendContString,1,Aname,Bname);
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }

                }
            }).start();


        }
    }
    else//发送的是语音
    {
        ChatMsgEntity entity = new ChatMsgEntity();
        entity.setDate(getDate());
        entity.setName("syskey");
        entity.setMsgType(false);//表示是自己发的
        entity.setText(pathWav);//录音后存放的声音的地址
        entity.setKind(2);//种类是2表示是声音

        mDataArrays.add(entity);

    }


    mAdapter.notifyDataSetChanged();//刷新

    mEditTextContent.setText("");

    mListView.setSelection(mListView.getCount() - 1);//指向最后一个


}

/////////////////////分割线////////////////////////////

package com.myweixin;

import android.R.integer;
import android.content.Context;
import android.database.DataSetObserver;

import android.media.MediaPlayer;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;

import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.LinearLayout;
import android.widget.TextView;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class ChatMsgViewAdapter extends BaseAdapter {

public static interface IMsgViewType
{
    int IMVT_COM_MSG = 0;
    int IMVT_TO_MSG = 1;
}



private static final String TAG = ChatMsgViewAdapter.class.getSimpleName();

private List<ChatMsgEntity> coll;

private Context ctx;

private ChatMsgEntity entity;

private LayoutInflater mInflater;

private     ViewHolder viewHolder = null;   

private String position1;

public ChatMsgViewAdapter(Context context, List<ChatMsgEntity> coll) {
    ctx = context;
    this.coll = coll;
    mInflater = LayoutInflater.from(context);
}

public int getCount() {
    return coll.size();
}

public Object getItem(int position) {
    return coll.get(position);
}

public long getItemId(int position) {
    return position;
}



public int getItemViewType(int position) {
    // TODO Auto-generated method stub
    ChatMsgEntity entity = coll.get(position);

    if (entity.getMsgType())
    {
        return IMsgViewType.IMVT_COM_MSG;
    }else{
        return IMsgViewType.IMVT_TO_MSG;
    }

}


public int getViewTypeCount() {
    // TODO Auto-generated method stub
    return 2;
}


public View getView(int position, View convertView, ViewGroup parent) {
    this.position1=position+"";

     entity = coll.get(position);
    boolean isComMsg = entity.getMsgType();


    if (convertView == null)
    {
          if (isComMsg)
          {
              convertView = mInflater.inflate(R.layout.chatting_item_msg_text_left, null);
          }else{
              convertView = mInflater.inflate(R.layout.chatting_item_msg_text_right, null);
          }



          viewHolder = new ViewHolder();
          viewHolder.tvSendTime = (TextView) convertView.findViewById(R.id.tv_sendtime);
          viewHolder.tvUserName = (TextView) convertView.findViewById(R.id.tv_username);
          viewHolder.tvContent = (TextView) convertView.findViewById(R.id.tv_chatcontent);
          viewHolder.isComMsg = isComMsg;

          //添加监听事件

// if(entity.getKind()==2)
// {
//
// viewHolder.tvContent.setOnClickListener(new OnClickListener() {
//

// @Override
// public void onClick(View v) {//设置监听器
// //play(viewHolder.tempTextView.getText().toString());
//

// }
// });
// }

          convertView.setTag(viewHolder);
    }else{
        viewHolder = (ViewHolder) convertView.getTag();
    }



    viewHolder.tvSendTime.setText(entity.getDate());
    viewHolder.tvUserName.setText(entity.getName());

    if(entity.getKind()==1)
    viewHolder.tvContent.setText(entity.getText());
    else{
        viewHolder.tvContent.setText("语音-点击播放");
          viewHolder.tvContent.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {//设置监听器


                    Log.i("BBB", position1);


                }
            });

    }
        return convertView;
}


static class ViewHolder { 
    public TextView tvSendTime;
    public TextView tvUserName;
    public TextView tvContent;
    public TextView tempTextView;
    public boolean isComMsg = true;
}




private void play(String url)
{

        try {
       MediaPlayer mp = new MediaPlayer();
            mp.reset();
            mp.setDataSource(url);
            mp.prepare();
            mp.start();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalStateException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


}

}

6个回答

gouxiaojin
gouxiaojin   2012.11.29 10:53
private OnClickListener clickHandler= new OnClickListener() {

    @Override
        public void onClick(View v) {
// 写你要实现的方法
}

}

button.setOnClickListener(clickHandler);//添加监听器
KPRF2009
KPRF2009 已贴代码,求指导,
大约 5 年之前 回复
KPRF2009
KPRF2009 关键是获取不了是第几个button,你点击了以后不知道怎么点击是第几个button
大约 5 年之前 回复
gouxiaojin
gouxiaojin 你每一个消息都设置个id,点击button时打开对应的id。
大约 5 年之前 回复
KPRF2009
KPRF2009 要对应不同的播放地址怎么办?
大约 5 年之前 回复
mansuifengqi
mansuifengqi   2012.11.29 11:15

微信应该是用linearlayout布局动态addview这个方式实现气泡的添加,你自定义一个布局,然后通过layoutinflaer获取你自己定义的layout,通过该layout使用findviewbyid找到这个气泡button,然后设置利用button.setonclickListener(new View.onclickListener(View v){
//播放声音事件
})

希望对你有所帮助。

KPRF2009
KPRF2009 已贴代码,求指导,
大约 5 年之前 回复
mansuifengqi
mansuifengqi 你怎么实现的可以代码贴一下吗?这样的话根本看不出问题在那?
大约 5 年之前 回复
KPRF2009
KPRF2009 测试了 不行
大约 5 年之前 回复
liangchichexin
liangchichexin   2012.11.29 11:41
private OnClickListener clickHandler= new OnClickListener() {

    @Override
        public void onClick(View v) {
       Button button  = (Button)v;
       String str = button.text();// 从Button 中取出 text ,就可以播放 text 的内容了。
 }

 }

// 动态添加的 Button 都用这个监听器就可以了,因为你要得到的是 Button 的text
Button button = new Button(...);
button.setOnClickListener(clickHandler);//添加监听器
liangchichexin
liangchichexin 看了你的代码,有点多,你可以标注一下想要播放声音的地方
大约 5 年之前 回复
KPRF2009
KPRF2009 已贴代码,求指导,
大约 5 年之前 回复
KPRF2009
KPRF2009 你说的方法还是不行,我已经用listview动态添加item(是一个button)了,就是不知道每一个item怎么设置点击后播放不同的声音。。。
大约 5 年之前 回复
liangchichexin
liangchichexin 这个就要具体看看已有的 id 都是些什么数了,如果已有的id是从0开始的,那你就设大一点,那个id一般是4个字节的整型,很容易避开吧。记得采纳哦
大约 5 年之前 回复
KPRF2009
KPRF2009 请问怎么设置id才可以不让id和系统已有的ID重复?
大约 5 年之前 回复
liangchichexin
liangchichexin 那就转换一下吧,弄一个 map ,key是int,value 是 声音地址,它们就一一对应了,然后把 key 作为 button 的id,在 onclick 中可以通过 id 在 map 中找到 声音地址。
大约 5 年之前 回复
KPRF2009
KPRF2009 id是int 地址是String啊?怎么办
大约 5 年之前 回复
liangchichexin
liangchichexin 我开始以为你是要在 click 事件中得到 text啊,既然不是,那你可以把声音的地址作为id设置给 button ,在 click 中把 id 取出来。
大约 5 年之前 回复
KPRF2009
KPRF2009 text不是button的名字吗?名字是声音的地址?
大约 5 年之前 回复
Sueyexin
Sueyexin   2012.11.29 13:08

你在创建这个button的时候就设置他的监听器:

Button button  = new Button (context);
button.setOnClickListener(listener);
KPRF2009
KPRF2009 每个Button对应不同的声音怎么实现?
大约 5 年之前 回复
CSDN_Ask
CSDN_Ask   2012.11.29 13:57

试一下这段代码:

myBtn.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    //Start accepting voice message
                }
            });

你也可以参考关于按钮监听器的链接:mkyong.com/android/android-button-example

KPRF2009
KPRF2009 不是一样的地址,要对应不同的地址怎么办?
大约 5 年之前 回复
woshiwoxingfu
woshiwoxingfu   2012.11.29 20:02

动态创建Button之后,再通过调用setOnClickLstener()方法就可以设置监听器了。
示例代码如下:

Button mButton = new Button(context);
mButton.setOnClickListener(new View.OnClickListener() {     
    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
    }
});
KPRF2009
KPRF2009 已贴代码,求指导,
大约 5 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!