Android 常用控件使用和点击事件学习

一、Button点击事件
1、setOnLongClickListener 是长按时触发

findViewById(R.id.fast).setOnLongClickListener(new View.OnLongClickListener() {
    
    
@Override
public boolean onLongClick(View view) {
    
    
fastforward_flag = true;
Log.i("AudioViewFunction-------","thread run------fast---enter---");
return true;
}
});

2、setOnClickListener 是点击时触发

findViewById(R.id.fast).setOnClickListener(new View.OnClickListener() {
    
    
@Override
public void onClick(View view) {
    
    
Log.i("AudioViewFunction-------","setOnclickListener------------");
MainActivity.StrReq = "AvrcpControllerInterface.sendPassThroughCommand";
MainActivity.BlRet = MainActivity.avrcp.sendPassThroughCommand(GlobalVariable.RemoteAddress,AvrcpControllerConstants.PASS_THRU_CMD_ID_FORWARD, AvrcpControllerConstants.KEY_STATE_PRESSED);
MainActivity.BlRet = MainActivity.avrcp.sendPassThroughCommand(GlobalVariable.RemoteAddress,AvrcpControllerConstants.PASS_THRU_CMD_ID_FORWARD, AvrcpControllerConstants.KEY_STATE_RELEASED);
MainActivity.StrParam = MainActivity.byteArrayToHexStr(GlobalVariable.RemoteAddress) + AvrcpControllerConstants.PASS_THRU_CMD_ID_FORWARD + AvrcpControllerConstants.KEY_STATE_PRESSED;
MainActivity.RequestInfoUpdate( MainActivity.StrReq,MainActivity.StrParam,MainActivity.BlRet+"");
}
});

3、setOnTouchListener 是触碰时触发

findViewById(R.id.fast).setOnTouchListener(new View.OnTouchListener() {
    
    
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
    
    
switch (motionEvent.getAction()){
    
    
case MotionEvent.ACTION_UP:
fastforward_flag = false;
Log.i("AudioViewFunction-------","ACTION_UP------------");
MainActivity.BlRet = MainActivity.avrcp.sendPassThroughCommand(GlobalVariable.RemoteAddress, AvrcpControllerConstants.PASS_THRU_CMD_ID_FF, AvrcpControllerConstants.KEY_STATE_PRESSED);
MainActivity.BlRet = MainActivity.avrcp.sendPassThroughCommand(GlobalVariable.RemoteAddress,AvrcpControllerConstants.PASS_THRU_CMD_ID_FF,AvrcpControllerConstants.KEY_STATE_RELEASED);
MainActivity.StrReq = "AvrcpControllerInterface.sendPassThroughCommand";
MainActivity.StrParam = MainActivity.byteArrayToHexStr(GlobalVariable.RemoteAddress) + AvrcpControllerConstants.PASS_THRU_CMD_ID_FF + AvrcpControllerConstants.KEY_STATE_PRESSED;
MainActivity.RequestInfoUpdate( MainActivity.StrReq,MainActivity.StrParam,MainActivity.BlRet+"");
break;
}
return false;
}
});

主要的工作流程为:
点击首先会触发OnTouchListener action_down事件;如果action_down返回true 表示action_down事件已经被消耗掉,不会再触发onclick和onlongclick事件;如果action_down返回false,则事件可以传递给其他的监听事件(继而就是onclick 和onlongclick事件),最后就是action up。
如果在OnTouchListener 中直接返回true ,那将不会触发onclick和onlongclick 事件。
注:上述以匿名内部类的方式实现点击事件 ,button的点击事件总共有三种方式:匿名内部类、接口类实现、xml中增加onClick属性。

二、Seekbar
SeekBar:拖动条,是ProgressBar的一个子类。常应用于音乐播放、音量条、播放进度条等场景。
1、xml配置

<SeekBar
android:id="@+id/seekbar"
android:layout_width="350dp"
android:layout_height="40dp"
android:layout_below="@+id/playmode"
android:layout_alignStart="@+id/playmode"
android:layout_marginLeft="5dp"
android:layout_marginTop="10dp"
android:max="0"
android:maxHeight="15dp"
android:minHeight="15dp"
android:progress="0"
android:progressDrawable="@drawable/layer_ist"
android:thumb="@drawable/testshape2"/>

2、设置进度条的总长

seekbar.setMax(Integer.parseInt(GlobalVariable.PlayDuration));

3、设置当前的进度值

seekbar.setProgress(Integer.parseInt(GlobalVariable.PlayPosition));

4、点击事件

seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
    
    
@Override
public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
    
    
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
    
    
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
    
    
}
});

三、Radiogroup
RadioGroup可以提供几个选项供用户选择,但只能选择其中的一个。RadioGroup的事件一般由RadioGroup直接响应,再根据RadioButton的ID进行区分。

playmode.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
    
    
@Override
public void onCheckedChanged(RadioGroup radioGroup, int i) {
    
    
switch (i){
    
    
case R.id.repeat:
byte[] atttibId_repeat ={
    
    AvrcpControllerConstants.SETTING_REPEAT};
byte[] attribVal_repeat ={
    
    AvrcpControllerConstants.REPEAT_STATUS_ALL_TRACK};
MainActivity.avrcp.setPlayerApplicationSettingValues(GlobalVariable.RemoteAddress, (byte)1, atttibId_repeat, attribVal_repeat);

MainActivity.StrReq = MainActivity.AVRCPCONTROLLERINTERFACE+"setPlayerApplicationSettingValues";
MainActivity.StrParam = MainActivity.byteArrayToHexStr(GlobalVariable.RemoteAddress) + Arrays.toString(atttibId_repeat) + Arrays.toString(attribVal_repeat);
MainActivity.RequestInfoUpdate(MainActivity.StrReq,MainActivity.StrParam);
break;
case R.id.single:
byte[] atttibId_single ={
    
    AvrcpControllerConstants.SETTING_REPEAT};
byte[] attribVal_single ={
    
    AvrcpControllerConstants.REPEAT_STATUS_SINGLE_TRACK};
MainActivity.avrcp.setPlayerApplicationSettingValues(GlobalVariable.RemoteAddress, (byte)1, atttibId_single, attribVal_single);

MainActivity.StrReq = MainActivity.AVRCPCONTROLLERINTERFACE+"setPlayerApplicationSettingValues";
MainActivity.StrParam = MainActivity.byteArrayToHexStr(GlobalVariable.RemoteAddress) + Arrays.toString(atttibId_single) + Arrays.toString(attribVal_single);
MainActivity.RequestInfoUpdate(MainActivity.StrReq,MainActivity.StrParam);
break;
case R.id.shuffle:
byte[] atttibId_shuffle ={
    
    AvrcpControllerConstants.SETTING_SHUFFLE};
byte[] attribVal_shuffle ={
    
    AvrcpControllerConstants.SHUFFLE_STATUS_ALL_TRACK};
MainActivity.avrcp.setPlayerApplicationSettingValues(GlobalVariable.RemoteAddress, (byte)1, atttibId_shuffle, attribVal_shuffle);

MainActivity.StrReq = "AvrcpControllerInterface.setPlayerApplicationSettingValues";
MainActivity.StrParam = MainActivity.byteArrayToHexStr(GlobalVariable.RemoteAddress) + Arrays.toString(atttibId_shuffle) + Arrays.toString(attribVal_shuffle);
MainActivity.RequestInfoUpdate( MainActivity.StrReq,MainActivity.StrParam);
break;
}
}
});

注:主要是涉及到对radiobutton 的事件的监听
四、ImageView
ImageView(图像视图),直接继承自View类,它的主要功能是用于显示图片,实际上它不仅仅可以用来显示图片,任何Drawable对象都可以使用ImageView来显示。ImageView可以适用于任何布局中,并且Android为其提供了缩放和着色的一些操作。

GlobalVariable.bitmap = BitmapFactory.decodeByteArray(GlobalVariable.coverImageByte, 0, GlobalVariable.coverImageByte.length);
coverArtImageView.setImageBitmap(GlobalVariable.bitmap);

五、AlertDialog对话框
AlertDialog弹出时是凌驾于所有的界面元素之上的,能够屏蔽其他控件的交互能力。因此,AlertDialog 一般是用于提示非常重要的事情和紧急的事件。

AlertDialog.Builder builder = new AlertDialog.Builder(AudioVideoFunction.this);
View playerView = LayoutInflater.from(AudioVideoFunction.this).inflate(R.layout.play_operation, null);
builder.setView(playerView);
builder.show();
final EditText playerId = playerView.findViewById(R.id.playerId);
final EditText playItemUid = playerView.findViewById(R.id.playItemUid);
final EditText playItemScope = playerView.findViewById(R.id.playItemScope);
final EditText playItemUidCounter = playerView.findViewById(R.id.playItemUidCounter);
playerView.findViewById(R.id.GetNowPlayingListBt).setOnClickListener(new View.OnClickListener() {
    
    
@Override
public void onClick(View view) {
    
    
GlobalVariable.media_type = "nowPlay";
MainActivity.avrcp.getNowPlayingList(GlobalVariable.RemoteAddress, (byte)0, (byte)10);
MainActivity.StrReq = "AvrcpControllerInterface.getNowPlayingList";
MainActivity.StrParam = MainActivity.byteArrayToHexStr(GlobalVariable.RemoteAddress)+", start: 0, end: 10";
MainActivity.RequestInfoUpdate( MainActivity.StrReq,MainActivity.StrParam);
new Handler().postDelayed(new Runnable() {
    
    
@Override
public void run() {
    
    
Message message = new Message();
message.what = 2;
handler.sendMessage(message);
}
},2000);
}
});
playerView.findViewById(R.id.GetPlayListBt).setOnClickListener(new View.OnClickListener() {
    
    
@Override
public void onClick(View view) {
    
    
MainActivity.avrcp.getPlayerList(GlobalVariable.RemoteAddress, (byte)0, (byte)10);
MainActivity.StrReq = "AvrcpControllerInterface.getPlayerList";
MainActivity.StrParam = MainActivity.byteArrayToHexStr(GlobalVariable.RemoteAddress)+", start: 0, end: 10";
MainActivity.RequestInfoUpdate( MainActivity.StrReq,MainActivity.StrParam);
}
});

六、ToggleButton开关
状态只能是选中和未选中,并且需要为不同的状态设置不同的显示文本

browseConnect.setOnClickListener(new View.OnClickListener() {
    
    
@Override
public void onClick(View v) {
    
    
if (browseConnect.isChecked())
{
    
    
MainActivity.BlRet = MainActivity.a2dp.connectA2dp(GlobalVariable.RemoteAddress);
MainActivity.StrReq = "A2dpSinkInterface.connectA2dp";
MainActivity.StrParam = MainActivity.byteArrayToHexStr(GlobalVariable.RemoteAddress);
MainActivity.RequestInfoUpdate( MainActivity.StrReq,MainActivity.StrParam,MainActivity.BlRet+"");
}
else
{
    
    
MainActivity.BlRet = MainActivity.a2dp.disconnectA2dp(GlobalVariable.RemoteAddress);
MainActivity.StrReq = "A2dpSinkInterface.disconnectA2dp";
MainActivity.StrParam = MainActivity.byteArrayToHexStr(GlobalVariable.RemoteAddress);
MainActivity.RequestInfoUpdate( MainActivity.StrReq,MainActivity.StrParam,MainActivity.BlRet+"");
}
}
});

七、ExpandableListView
ExpandableListView( 分组列表 ) 是一个有两层的 ListView,也就是一个分组列表。可以把数据分为多个组和多个子项。

static expandableAdapter expandableadapter;
static ExpandableListView expandableLv;
public static List<mediaGroup> mediagroupList = new ArrayList<>();

expandableadapter = new expandableAdapter(AudioVideoFunction.this,mediagroupList);
expandableLv = findViewById(R.id.expand_ListView);
expandableLv.setAdapter(expandableadapter);
expandableLv.setGroupIndicator(null);
expandableLv.setOnTouchListener(new View.OnTouchListener() {
    
    
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
    
    
if(motionEvent.getAction() == MotionEvent.ACTION_MOVE){
    
    
scroll_audio.requestDisallowInterceptTouchEvent(true);
}
return false;
}
});

expandableLv.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
    
    
@Override
public boolean onGroupClick(ExpandableListView expandableListView, View view, int i, long l) {
    
    
if ( expandableListView.isGroupExpanded(i) ) {
    
    

expandableListView.collapseGroup(i);
}else{
    
    
media_playList_count =2;
GlobalVariable.groupPosition = i;
expandableListView.expandGroup(i);

MainActivity.avrcp.getFolderList(GlobalVariable.RemoteAddress, (byte)0, (byte)10);
MainActivity.StrReq = "AvrcpControllerInterface.getFolderList";
MainActivity.StrParam = MainActivity.byteArrayToHexStr(GlobalVariable.RemoteAddress)+", start: 0, end: 10";
MainActivity.RequestInfoUpdate( MainActivity.StrReq,MainActivity.StrParam);
}
return true;
}
});

expandableLv.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
    
    
@Override
public boolean onChildClick(ExpandableListView expandableListView, View view, int i, int i1, long l) {
    
    

return true;
}
});
expandableLv.setOnGroupExpandListener(new ExpandableListView.OnGroupExpandListener() {
    
    
@Override
public void onGroupExpand(int i) {
    
    
MainActivity.avrcp.changeFolderPath(GlobalVariable.RemoteAddress, (byte)AvrcpControllerConstants.FOLDER_NAVIGATION_DIRECTION_DOWN, mediagroupList.get(i).getUUid());
MainActivity.StrReq = "AvrcpControllerInterface.changeFolderPath";
MainActivity.StrParam = MainActivity.byteArrayToHexStr(GlobalVariable.RemoteAddress) + " dir: " + AvrcpControllerConstants.FOLDER_NAVIGATION_DIRECTION_DOWN
+ " UID: " + Arrays.toString(mediagroupList.get(i).getUUid());
MainActivity.RequestInfoUpdate( MainActivity.StrReq,MainActivity.StrParam);

}

});
expandableLv.setOnGroupCollapseListener(new ExpandableListView.OnGroupCollapseListener() {
    
    
@Override
public void onGroupCollapse(int i) {
    
    
AudioVideoFunction.mediagroupList.get(i).childList.clear();
Log.i("AudioVideoFunction-----","onGroupCollapse"+"---"+"---"+i);
MainActivity.avrcp.changeFolderPath(GlobalVariable.RemoteAddress, (byte)AvrcpControllerConstants.FOLDER_NAVIGATION_DIRECTION_UP, mediagroupList.get(i).getUUid());
MainActivity.StrReq = "AvrcpControllerInterface.changeFolderPath";
MainActivity.StrParam = MainActivity.byteArrayToHexStr(GlobalVariable.RemoteAddress) + " dir: " + AvrcpControllerConstants.FOLDER_NAVIGATION_DIRECTION_UP
+ " UID: " + Arrays.toString(mediagroupList.get(i).getUUid());
MainActivity.RequestInfoUpdate( MainActivity.StrReq,MainActivity.StrParam);
}
});

八、Switch
Switch本质上是一个按钮。

BTSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
    
    
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
    
    
if (isChecked){
    
    

}ese{
    
    

}
}
});

九、Spinner
Spinner(下拉菜单)是Android开发中常用到的一种控件,可以用来实现TextView等控件内容的选择性自动填写。

PairModeControl.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
    
    
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
    
    
String[] mode = getResources().getStringArray(R.array.pair_mode);
PairModeControlInfo = mode[i];
}

@Override
public void onNothingSelected(AdapterView<?> adapterView) {
    
    

}
});

十、ListView
ListView主要用于显示一个垂直滚动的数据集合,允许用户通过手指上下滑动的方式将屏幕外的数据滚动到屏幕内,同时屏幕上原有的数据则会滚动出屏幕。

public static ListView PairedDeviceList;
private static msgAdapter pdadapter;
public static ArrayList<Msg> pdlst = new ArrayList<Msg>();

PairedDeviceList = findViewById(R.id.PairedDeviceList);
pdadapter = new msgAdapter(DevicePairManage.this, R.layout.adapter_item,pdlst);
PairedDeviceList.setAdapter(pdadapter);
PairedDeviceList.setOnTouchListener(new View.OnTouchListener() {
    
    
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
    
    
if(motionEvent.getAction() == MotionEvent.ACTION_MOVE){
    
    
scroll_devpair.requestDisallowInterceptTouchEvent(true);
}
return false;
}
});
PairedDeviceList.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
    
    
@Override
public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) {
    
    
final Msg msg = pdlst.get(i);
final String[] operation = {
    
    "连接","断开","删除配对记录"};
final String[] cmd = new String[1];
cmd[0] = "connect";
AlertDialog.Builder builder = new AlertDialog.Builder(DevicePairManage.this);

builder.setSingleChoiceItems(operation,0, new DialogInterface.OnClickListener(){
    
    
@Override
public void onClick(DialogInterface dialogInterface, int i) {
    
    
switch (i){
    
    
case 0:
cmd[0] = "connect";
break;
case 1:
cmd[0] = "disconnect";
break;
case 2:
cmd[0] = "removeBond";
break;
}
}
});
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
    
    
@Override
public void onClick(DialogInterface dialogInterface, int i) {
    
    
switch (cmd[0]) {
    
    
case "connect":
if(msg.getaddr().length()%2 != 0){
    
    
Toast.makeText(DevicePairManage.this, "数据格式不对: "+msg.getaddr().length(),Toast.LENGTH_LONG).show();
return;
}
if(GlobalVariable.a2dpSrc_and_hfpag == false) {
    
    
MainActivity.BlRet = MainActivity.a2dp.connectA2dp(getBytesFromAddress(msg.getaddr()));
MainActivity.StrReq = MainActivity.A2DPSINKINTERFACE + "connectA2dp";
MainActivity.StrParam = "addr: " + msg.getaddr();
MainActivity.RequestInfoUpdate(MainActivity.StrReq, MainActivity.StrParam, MainActivity.BlRet + "");

MainActivity.BlRet = MainActivity.a2dp.muteA2dp(getBytesFromAddress(msg.getaddr()), true);
MainActivity.StrReq = MainActivity.A2DPSINKINTERFACE + "muteA2dp";
MainActivity.StrParam = "addr: " + msg.getaddr() + ", enable: true";
MainActivity.RequestInfoUpdate(MainActivity.StrReq, MainActivity.StrParam, MainActivity.BlRet + "");
}
if(GlobalVariable.a2dpSrc_and_hfpag == true) {
    
    
MainActivity.a2dp_src.connectA2dp(getBytesFromAddress(msg.getaddr()));
MainActivity.StrReq = MainActivity.A2DPSOURCEINTERFACE + "connectA2dp";
MainActivity.StrParam = "addr: " + msg.getaddr();
MainActivity.RequestInfoUpdate(MainActivity.StrReq, MainActivity.StrParam, MainActivity.BlRet + "");
}
break;
case "disconnect":
if(msg.getaddr().length()%2 != 0){
    
    
Toast.makeText(DevicePairManage.this, "数据格式不对: "+msg.getaddr().length(),Toast.LENGTH_LONG).show();
return;
}
if(GlobalVariable.a2dpSrc_and_hfpag == false) {
    
    
MainActivity.BlRet = MainActivity.a2dp.muteA2dp(getBytesFromAddress(msg.getaddr()), false);
MainActivity.StrReq = MainActivity.A2DPSINKINTERFACE + "muteA2dp";
MainActivity.StrParam = "addr: " + msg.getaddr() + ", enable: false";
MainActivity.RequestInfoUpdate(MainActivity.StrReq, MainActivity.StrParam, MainActivity.BlRet + "");

MainActivity.BlRet = MainActivity.a2dp.disconnectA2dp(getBytesFromAddress(msg.getaddr()));
MainActivity.StrReq = MainActivity.A2DPSINKINTERFACE + "disconnectA2dp";
MainActivity.StrParam = "addr: " + msg.getaddr();
}

if(GlobalVariable.a2dpSrc_and_hfpag == true){
    
    
MainActivity.a2dp_src.disconnectA2dp(getBytesFromAddress(msg.getaddr()));
MainActivity.StrReq = MainActivity.A2DPSOURCEINTERFACE + "disconnectA2dp";
MainActivity.StrParam = "addr: " + msg.getaddr();
MainActivity.RequestInfoUpdate(MainActivity.StrReq, MainActivity.StrParam, MainActivity.BlRet + "");
}
MainActivity.RequestInfoUpdate(MainActivity.StrReq,MainActivity.StrParam, MainActivity.BlRet+"");
MainActivity.BlRet = MainActivity.pbap.disconnect(getBytesFromAddress(msg.getaddr()));
MainActivity.StrReq = MainActivity.PBAPCLIENTINTERFACE+"disconnect";
MainActivity.StrParam = "addr: "+msg.getaddr();
MainActivity.RequestInfoUpdate(MainActivity.StrReq,MainActivity.StrParam, MainActivity.BlRet+"");
MainActivity.BlRet = MainActivity.hfpc.disconnect(getBytesFromAddress(msg.getaddr()));
MainActivity.StrReq = MainActivity.HFPCLIENTINTERFACE+"disconnect";
MainActivity.StrParam = "addr: "+msg.getaddr();
MainActivity.RequestInfoUpdate(MainActivity.StrReq,MainActivity.StrParam, MainActivity.BlRet+"");
MainActivity.BlRet = MainActivity.map.disconnect(getBytesFromAddress(msg.getaddr()));
MainActivity.StrReq = MainActivity.MAPCLIENTINTERFACE+"disconnect";
MainActivity.StrParam = "addr: "+msg.getaddr();
MainActivity.RequestInfoUpdate(MainActivity.StrReq,MainActivity.StrParam, MainActivity.BlRet+"");
break;
case "removeBond":
if(msg.getaddr().length()%2 != 0){
    
    
Toast.makeText(DevicePairManage.this, "数据格式不对: "+msg.getaddr().length(),Toast.LENGTH_LONG).show();
return;
}
MainActivity.BlRet = MainActivity.adapt.removeBond(getBytesFromAddress(msg.getaddr()));
MainActivity.StrReq = MainActivity.BLUETOOTHINTERFACE+"removeBond";
MainActivity.StrParam = "addr: "+msg.getaddr();
MainActivity.RequestInfoUpdate(MainActivity.StrReq,MainActivity.StrParam, MainActivity.BlRet+"");
rmPdInfo(msg);
break;
}

}
});

builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
    
    
@Override
public void onClick(DialogInterface dialogInterface, int i) {
    
    
}
});
builder.show();
return true;
}
});

注:此处是在listview 的点击事件上加入对话框部分的显示。

猜你喜欢

转载自blog.csdn.net/qq_33782617/article/details/126820479
今日推荐