android绑定控件
Ⅰ 如何绑定android点击事件
绑定android点击事件需要在该空间添加android:onClick="click"属性(click是为事件的方法),具体操作步骤如下:
1、使用Android studio创建一个Android项目,如下图:
Ⅱ android 开发 listview绑定radiobutton控件 如何实现listview列表中只有一个radiobutton被选中
listview绑定radiobutton控件,需要用自定义的Adapter
控制RadminButton只能选一个的方法:
使用自定义Adapter
在adapter.getView方法中给RadminButton注册点击事件
在onClick事件中用个集合记录当前RadminButton的checked状态
调用adapter.notifyDataSetChanged(); 刷新列表即可
因为刷新列表的时候,会重新调用getView方法
Ⅲ android中的simpleAdapter.viewBinder();是否支持Button控件的绑定
刚刚去查了下文档,综合了一下得出了以下结论:
首先android.widget.SimpleAdapter.ViewBinder接口下有setViewValue(View view, Object data, String textRepresentation) 这个抽象方法,而TextView和ImageView都是直接继承自View,而Button是通过继承TextView间接继承View。另外:SimpleAdapter中的public void setViewImage (ImageView v, String value) 和public void setTextView(TextView tv,String value)均是调用bindView去给ImageView设置图像或是给TextView设置文本值,但只有当ViewBinder不存在或者如果存在的ViewBinder无法处理绑定到一个ImageView或者TextView时才调用上述的那两个方法。这两点中都没有提及到Button相应的适配方法,我想可能Android在定义时就没有考虑将Button加入进去。
我是这么分析的,希望能够帮到你。
Ⅳ Android 多个控件绑定同一个PopupWindow,当点击popupWindow中的控件时获取到触发popWindow控件的文本
有长按事件啊,每个控件的都有的
longtouch应该是
Ⅳ android 不再手写控件ID绑定,插件化批量绑定
记录下插件使用中遇到的问题
由于ButterKnife 已经不开始维护了,新项目建议使用第二种方式
GenerateFindViewById 使用效果如下图
安装路径
按照上面安装插件,由于我公司电脑android开发环境搭建是直接 从笔记本上打包java、 android studio、android sdk 拷贝到公司电脑D盘目录,而非android 安装时的默认C盘目录,安装好插件后,每次重启android studio 会报 Plugin "GenerateFindViewById Injections!" is incompatible (supported only in IntelliJ IDEA).错误 。
)
Ⅵ 如何在Android中添加控件
可以如下操作: 1、在一段文字中插入n个标记,比如 2、用string.split("")方法把该文字拆分成String数组,进而把String数组转换成TextView数组tvs[n+1] 3、蓝色按钮是自定义的控件,共有n个,用for循环和LayoutInflater方法转换成cvs[n], 4、for
Ⅶ 如何绑定android点击事件
在Android中为组件绑定点击事件的方式可以分为四种,
1、 在xml布局文件中,定义onclick的方式
<!—第一步在XML文件中给对应组件添加Onclick属性-->
<Button
android:id="@+id/submitbutton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:onClick="buttonClickHandle"
android:layout_alignParentTop="true"
android:text="提交" />
//第二步在对应的Activity中创建一个与onClick属性值相同的方法,并传入一个View参数,当Button被点击时就会回调这个方法。
public void buttonClickHandle(View view) {
Snackbar.make(coordinatorLayout, "你点击了Button", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
另外三种绑定点击事件的方式实际上就是通过组件调用setOnClickListener()的方法,下面我们就来看一下这个方法的源码。
/**
* Register a callback to be invoked when this view is clicked. If this view is not
* clickable, it becomes clickable.
*
* @param l The callback that will run
*
* @see #setClickable(boolean)
*/
public void setOnClickListener(@Nullable OnClickListener l) {
if (!isClickable()) {
setClickable(true);
}
getListenerInfo().mOnClickListener = l;
}
根据源码我们可以看到这个方法中需要一个OnClickListener的对象。下面我们就来看看这个OnClickListener对象是个什么东东。
/**
* Interface definition for a callback to be invoked when a view is clicked.
*/
public interface OnClickListener {
/**
* Called when a view has been clicked.
*
* @param v The view that was clicked.
*/
void onClick(View v);
}
根据源码我们可以看到实际上这个OnClickListener就是一个接口,这个接口中有一个onClick的抽象方法。所以我们在创建这个OnClickListener对象是还需要实现这个抽象方法。这个onClick的抽象方法实际上就是当我们点击按钮后会回调的方法。我们对于点击事件的响应处理就在这个方法中进行。
现在我们已经了解了设置点击事件的setOnClickListener方法,根据我们如何创建这个方法中的OnClickListener对象,我们设置点击事件的方式可以分为如下三种:
1、内部类的形式
a. package com.example.hsport.catalog;
import android.os.Bundle;
import android.support.design.widget.CoordinatorLayout;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
private CoordinatorLayout coordinatorLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
coordinatorLayout = (CoordinatorLayout) findViewById(R.id.coordinator);
// 获取button对象
Button button = (Button) findViewById(R.id.submitbutton);
//创建内部类的实例
MyListener myListener = new MyListener();
//设置button的点击事件,将实现OnClickListener接口的内部类实例传入到setOnClickListener方法中
button.setOnClickListener(myListener);
}
//创建一个内部类实现View.OnClickListener接口,并实现其onClick方法
private class MyListener implements View.OnClickListener {
@Override
public void onClick(View v) {
Snackbar.make(coordinatorLayout, "你点击了Button", Snackbar.LENGTH_LONG).setAction("Action", null).show();
}
}
}
2、 匿名内部类的方式
package com.example.hsport.catalog;
import android.os.Bundle;
import android.support.design.widget.CoordinatorLayout;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
private CoordinatorLayout coordinatorLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
coordinatorLayout = (CoordinatorLayout) findViewById(R.id.coordinator);
//获取Button对象
Button button = (Button) findViewById(R.id.submitbutton);
//以创建一个View.OnClickListener的匿名内部类,并实现它的onClick方法
button.setOnClickListener(new View.OnClickListener() {
//在onClick方法中我们就可以设置button的响应代码了
@Override
public void onClick(View v) {
Snackbar.make(coordinatorLayout, "你点击了Button",Snackbar.LENGTH_LONG).setAction("Action", null).show();
}
});
}
3、 让主类实现OnClickListener接口,然后再主类实现未实现的方法
package com.example.hsport.catalog;
import android.os.Bundle;
import android.support.design.widget.CoordinatorLayout;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private CoordinatorLayout coordinatorLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
coordinatorLayout = (CoordinatorLayout) findViewById(R.id.coordinator);
//获取Button对象
Button button = (Button) findViewById(R.id.submitbutton);
//因为我们让MainActivity实现了View.OnClickListener这个接口,所以setOnClickListener方法中的参数直接传入this即可。
button.setOnClickListener(this);
}
//因为MainActivity实现了View.OnClickListener接口,所以在MainActivity中还有要实现该接口中改的onClick方法来处理点击事件。
@Override
public void onClick(View v) {
Snackbar.make(coordinatorLayout, "你点击了Button",Snackbar.LENGTH_LONG).setAction("Action", null).show();
}
}
关于如何给组件绑定点击事件,是Android中的基础知识,如果你还想更加详细的了解,推荐你可以去一个叫做秒秒学的教程网站看看,夯实下基础。
Ⅷ Android,DataBinding的官方双向绑定
在Android Studio 2.1 Preview 3之后,官方开始支持双向绑定了。
可惜目前Google并没有在Data Binding指南里面加入这个教程,并且在整个互联网之中只有 这篇文章 介绍了如何使用反向绑定。
在阅读一下文章之前,我假设你已经知道如何正向绑定。
在正向绑定中,我们在Layout里面的绑定表达式是这样的:
当user.name的数据改动时,我们的TextView都会同步改变文字。
现在假设一种情况,当你更换成EditText时,如果你的用户名User.name已经绑定到 EditText 中,当用户输入文字的时候,你原来的user.name数据并没有同步改动,因此我们需要修改成:
看出微小的差别了吗?对,就是"@{}"改成了"@={}",是不是很简单?
同样你也可以在别的View上引用属性:
当CheckBox的状态发生改变的时候,ImageView也会同时发生改变。在复杂情况下,这个特性没什么卵用,因为逻辑部分我们是不建议写在XML中。
开启双向绑定,需要在项目的build.gradle中设置:
同样,你需要在你Mole的build.gradle中设置:
我们刚才的例子里面只显示了系统自带的应用,那么如果是自定义控件,或者是我们更细颗粒度的 Observable 呢?等下就揭晓如何自定义自己的双向绑定,我们来看看目前Android支持的控件:
设想一下我们使用了下拉刷新 SwipeRefreshLayout 控件,这个时候我们希望在加载数据的时候能控制refreshing的状态,所以我们加入了 ObservableBoolean 的变量swipeRefreshViewRefreshing来正向绑定数据,并且能够在用户手动下拉刷新的时候同步更新swipeRefreshViewRefreshing数据:
接下来我们需要告诉框架,我们需要将 SwipeRefreshLayout 的isRefreshing的值反向绑定到 swipeRefreshViewRefreshing :
这是一种简单的定义,其中event和method都不是必须的,因为系统会自动生成,写出来是为了更好地了解如何绑定的,可以参考官方文档 InverseBindingMethod 。
当然你也可以使用另外一种写法,并且如果你的值并不是直接对应 Observable 的值的时候,就可以在这里进行转换:
上面的event同样也不是必须的。以上的定义都是为了让我们能够在布局文件中使用"@={}"这个双向绑定的特性。接下来你需要告诉框架如何处理refreshingAttrChanged事件,就像处理一般的监听事件一样:
一般情况下,我们都需要设置正常的OnRefreshListener,所以我们可以合并写成:
现在我们终于可以使用双向绑定的技术啦。但是要注意,需要设置 requireAll = false ,否则系统将识别不了refreshingAttrChanged属性,前文提到的文章例子里并没有设置这个。
在ViewModel中,我们的数据是这样的:
在布局文件中是这样设置的:
最后我们还有一个小问题,就是双向绑定有可能会出现死循环,因为当你通过Listener反向设置数据时,数据也会再次发送事件给View。所以我们需要在设置一下避免死循环:
这样就没问题啦。