首页 文章 精选 留言 我的

精选列表

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

.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是没有问题的 在 服务器本地上面使用 命令生产消费消息是可以的。 这样就奇怪了。 于是我换成了 另一个 主题进行测试发现是没有问题的。。。 同时注意到了原来是 我写的 主题名称 后面带有空格 低级错误啊!但是后面的空格真的是空格?我自己测试手敲空格,经过测试没有问题的。也就是如果是 主题后面有空格是可以的。 那就是主题名称 后面带上了什么不可内容。 我想起来了,我是通过复制这个主题名称 的,估计复制多了什么其他内容。

资源下载

更多资源
Apache Tomcat

Apache Tomcat

Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。

Eclipse

Eclipse

Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。

JDK

JDK

JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。