首页 文章 精选 留言 我的

精选列表

搜索[响应],共10026篇文章
优秀的个人博客,低调大师

.Net 转战 Android 4.4 日常笔记(8)--常见事件响应及实现方式

在Andrioid开发中,常见的事件如下 单击事件 OnClickListener 长按事件 OnLongClickListener 滑动事件 OnTouchListenner 键盘事件 OnKeyListenner 焦点事件 setOnFoucsChangeListener 设置方式 1.动态设置(最常用的方式) Button btn = (Button) findViewById(R.id.btnTest); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Log.i("Tip","按钮被点击了"); } }); 2.配置方式(仅限于Button的OnClick事件) <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Test1" android:id="@+id/btnTest1" android:layout_below="@+id/btnTest" android:layout_centerHorizontal="true" android:layout_marginTop="56dp" android:onClick="Test1"/> 在拖入的控件加入 android:onClick="Test1" ,后台必须有Test1方法对应,在Test1按Alt+Enter创建方法 public void Test1(View view) { //传入的View是当前的button Button btn = (Button)view; btn.setText("改变了按钮的文本"); Log.i("Tip","配置的按钮被点击了!"); } 3.可复用方式(这种方式适用于重复可复用代码) 首先在我们的MainActivity加入方法 private View.OnClickListener listener = new View.OnClickListener() { @Override public void onClick(View view) { Log.i("Tip","监听到按钮点击!"); } }; 拖入3个按钮并设置ID分别为btnTest2,btnTest3,btnTest4 在onCreate方法中加入这3个按钮的事件。 Button btn2 = (Button) findViewById(R.id.btnTest2); Button btn3 = (Button) findViewById(R.id.btnTest3); Button btn4 = (Button) findViewById(R.id.btnTest4); btn2.setOnClickListener(listener); btn3.setOnClickListener(listener); btn4.setOnClickListener(listener); 这样我们用了更少的代码获得更清晰的结构 接下来我们要在方法中判断是那个按钮点击了 private View.OnClickListener listener = new View.OnClickListener() { @Override public void onClick(View view) { //通过getId来获取触发的是那个按钮 switch(view.getId()) { case R.id.btnTest2: Log.i("Tip","点击按钮2!"); break; case R.id.btnTest3: Log.i("Tip","点击按钮3!"); break; case R.id.btnTest4: Log.i("Tip","点击按钮4!"); break; } } }; 查看结果 长按和点击事件存在产生的问题 如果我们一个事件同时绑定了OnClick事件和OnLongClick事件,会发生什么! 拖入一个button Id为btnTest5,并绑定2个事件 Button btn5 = (Button) findViewById(R.id.btnTest5); btn5.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Log.i("Tip","按钮被点击了"); } }); btn5.setOnLongClickListener(new View.OnLongClickListener(){ @Override public boolean onLongClick(View view) { Log.i("Tip","按钮被长按了了"); return false; } }); 我们长按后松开按钮看看打印出什么(2个事件触发了,但是我们貌似只要长按,在我们理解中,长按就是长按,单击就是单击) 这时我们看看帮助文档怎么说 Returns true if the callback consumed the long click, false otherwise. 大约理解到 onLongClick 返回true时候会回调消耗这个事件不会往下传递,现在我们改下代码 btn5.setOnLongClickListener(new View.OnLongClickListener(){ @Override public boolean onLongClick(View view) { Log.i("Tip","按钮被长按了"); return true; } }); 运行之后的点击只显示长按事件的触发 触摸事件 Touch事件由元事件组成action_up,action_down,action_move等等.... Button btn6 = (Button) findViewById(R.id.btnTest6); //Touch事件由元事件组成action_up,action_down,action_move等等.... btn6.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { int event = motionEvent.getAction(); if(event==MotionEvent.ACTION_DOWN) { Log.i("Tip","被按下..."); } else if(event==MotionEvent.ACTION_MOVE) { Log.i("Tip","被移动..."); } else if(event==MotionEvent.ACTION_UP) { Log.i("Tip","被松开..."); } return false; } }); 可以看到鼠标按后在上面移动后松开的事件触发! 再来看一个有趣的动作,可以移动的按钮,根据容器的event获取 X和Y坐标给按钮 现在打开MainActivity.xml的给容器一个ID值 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context="com.ymnets.testtouchlistener.app.MainActivity" android:id="@+id/myLayout" > 改变一下代码 ViewGroup viewGroup = (ViewGroup) findViewById(R.id.myLayout); final Button btn = (Button)findViewById(R.id.button); //Touch事件由元事件组成action_up,action_down,action_move等等.... viewGroup.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { int event = motionEvent.getAction(); if(event==MotionEvent.ACTION_MOVE) { btn.setX(motionEvent.getX()); btn.setY(motionEvent.getY()); Log.i("Tip","被移动..."); } return true; } }); 其中ViewGroup其实就是布局,View就是组件元素 现在大力的移动手指吧! 焦点事件 焦点事件跟我们的JS的焦点事件基本一个性质。 但是Android得到焦点和失去焦点都在同个方法内运行 随便拖一个TextBox在安卓里面叫EditText 输入事件代码 EditText editText = (EditText) findViewById(R.id.editText); editText.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View view, boolean b) { Log.i("Tip","有焦点了..."); } }); 当文本框得到和失去焦点时候都会出现日志 05-20 05:03:52.009 1165-1165/com.ymnets.testtouchlistener.app I/Tip﹕ 有焦点了... 键盘事件 设置我们文本框的键盘事件! editText.setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View view, int i, KeyEvent keyEvent) { if(keyEvent.getAction()==KeyEvent.ACTION_UP) { Log.i("Tip", i + ""); } return false; } }); 其中的i是keyCode,输出了keyCode 当然我们也可以根据keyCode去获取点击了哪个键!实际上非常有趣... 本文转自ymnets博客园博客,原文链接:http://www.cnblogs.com/ymnets/p/3738617.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

kafka 生产发送消息失败无响应,或者Error while fetching metadata with correlation id

今天在使用代码编写kafka 生产者发送消息的时候,因为我的手误出现的搞笑的事情。 同样的代码和kafka 在不久前执行过,是没有问题的。 代码如下 package streaming.utils import java.util import java.util.{Date, Properties, UUID} import com.alibaba.fastjson.JSONObject import org.apache.commons.lang3.time.FastDateFormat import org.apache.kafka.clients.producer.{KafkaProducer, ProducerRecord} import scala.util.Random /** * Author: Michael PK QQ: 1990218038 * * Kafka数据生产者 */ object ProducerApp { def main(args: Array[String]): Unit = { val props = new Properties props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer") props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer") props.put("bootstrap.servers", ParamsConf.brokers) props.put("request.required.acks","1") val topic = ParamsConf.topic val producer = new KafkaProducer[String,String](props) val random = new Random() val dateFormat = FastDateFormat.getInstance("yyyyMMddHHmmss") for(i <- 1 to 100){ val time = dateFormat.format(new Date())+"" val userid = random.nextInt(1000)+"" val courseid = random.nextInt(500)+"" val fee = random.nextInt(400)+"" val result = Array("0","1") // 0未成功支付,1成功支付 val flag = result(random.nextInt(2)) var orderid = UUID.randomUUID().toString val map = new util.HashMap[String, Object]() map.put("time", time) map.put("userid",userid) map.put("courseid",courseid) map.put("fee", fee) map.put("flag", flag) map.put("orderid",orderid) val json = new JSONObject(map) producer.send(new ProducerRecord[String,String](topic(0),json.toJSONString)) } println("PK Kafka生产者生产数据完毕...") } } 代码很简单。只是用来模拟生产数据而已。 一直以来的使用的 都是 2.0 版本的 kafka client <dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka-clients</artifactId> <version>2.0.0</version> </dependency> 但是今天执行的上面的代码的时候。 就 不能发生消息了,也没有错误的提示。 程序也没有关闭。 通过 debug 发现卡在 doSend 代码里面了 private Future<RecordMetadata> doSend(ProducerRecord<K, V> record, Callback callback) { TopicPartition tp = null; try { throwIfProducerClosed(); // first make sure the metadata for the topic is available ClusterAndWaitTime clusterAndWaitTime; try { clusterAndWaitTime = waitOnMetadata(record.topic(), record.partition(), maxBlockTimeMs); } catch (KafkaException e) { if (metadata.isClosed()) throw new KafkaException("Producer closed while send in progress", e); throw e; } 虽然它抛出了异常,但是 不能进入 if (metadata.isClosed()) 逻辑里面 外层并没有捕获它的异常。通过debug 这个 异常 e 是 Failed to update metadata after 60000 ms. 考虑到它的版本也服务器版本不一样 就试着 减低版本看看 <dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka-clients</artifactId> <version>1.1.0</version> </dependency> 执行的时候不停的提示: lientId=producer-1] Error while fetching metadata with correlation id 参考 https://blog.csdn.net/luozhonghua2014/article/details/80369469 https://www.jianshu.com/p/2db7abddb9e6 https://jingyan.baidu.com/article/86f4a73ed181b837d6526930.html 并且测试过了 :telnet 192.168.0.205 9092是没有问题的 在 服务器本地上面使用 命令生产消费消息是可以的。 这样就奇怪了。 于是我换成了 另一个 主题进行测试发现是没有问题的。。。 同时注意到了原来是 我写的 主题名称 后面带有空格 低级错误啊!但是后面的空格真的是空格?我自己测试手敲空格,经过测试没有问题的。也就是如果是 主题后面有空格是可以的。 那就是主题名称 后面带上了什么不可内容。 我想起来了,我是通过复制这个主题名称 的,估计复制多了什么其他内容。

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册