
如何让 EditText 在 Activity 启动时不获得焦点
在进入一个Activity时,如果这个Activity中有EditText,则这个EditText会自动获取焦点,然后就会d出软键盘,这样给用户体验不是很好。所以一般会通过代码控制让EditText不获取焦点。常用的方式如下,在Activity的布局文件中加上如下代码:
<!-- 输入焦点控制 -->
<LinearLayout
android:layout_width="0px"
android:layout_height="0px"
android:focusable="true"
android:focusableInTouchMode="true" />
在日前开发的一个项目中界面中除了EditText就是Spinner 和Button等空间,EditText 获取焦点以后,点击Spinner总是无法移除焦点:采取如下方式解决,
当点击Spinner时让EditText失去焦点即可:(见标红代码)
我今天也遇到这个问题了
开始以为当spinner在scrollview时 存在android版本兼容问题
于是改成了popupwindow 比spinner麻烦好多 页面有多个EditText用于d出popupwindow展示不同的下拉数据 点击TextView要记录当前的EditText当点击popupwindow的列表项关闭popupwindow时要取到数据手动调用之前记录的EditText的setttext方法
而用spinner 这一切都是自动的
前面都是废话 结果用popupwindow实现完后还是一样 会自动滚动到顶部 这时才仔细分析问题原因
原来是在点击EditText(设置了clickable=true;focusable=false)d出spinner/popupwindow时焦点在页面外的EditText上 ,于是关闭spinner/popupwindow时页面自动滚动到获取焦点的EditText
解决方法很简单 在focusable=false的EditText的点击事件里去掉焦点
if (getCurrentFocus()!=null) {
getCurrentFocus()clearFocus();
}
重写一下Adapter,然后自己对Adapter每个Item布局,在布局里面设置一下点击效果就行了。如:
public class MainActivity extends Activity {
private Spinner mSpinner;
@Override
protected void onCreate(Bundle savedInstanceState) {
superonCreate(savedInstanceState);
setContentView(Rlayoutactivity_main);
initView();
}
private void initView(){
mSpinner = (Spinner)findViewById(Ridspinner);
MyAdapter adapter = new MyAdapter(getResources()getStringArray(Rarraygirl_names));
mSpinnersetAdapter(adapter);
}
private class MyAdapter extends BaseAdapter{
private String[] idInt ;
public MyAdapter(String[] idInt){
thisidInt = idInt;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return idIntlength;
}
@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return idInt[arg0];
}
@Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return 0;
}
@Override
public View getView(int arg0, View arg1, ViewGroup arg2) {
// TODO Auto-generated method stub
if(arg1 == null){
arg1 = getLayoutInflater()inflate(Rlayoutspinner_item, null);
}
TextView text = (TextView)arg1findViewById(Ridspinner_item_id);
textsetText(idInt[arg0]);
return arg1;
}
}
spinner_itemxml
<xml version="10" encoding="utf-8">
<LinearLayout xmlns:android=">
1下拉列表使用Spinner。
2布局:
<Spinner android:id="@+id/Spinner01"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
</Spinner>
3实现
1)新增选择内容:String[] m={"A型","B型","O型","AB型","其他"};
2)初始化设配器:
private ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,androidRlayoutsimple_spinner_item,m);
adaptersetDropDownViewResource(androidRlayoutsimple_spinner_dropdown_item); //设置下拉列表的风格
spinnersetAdapter(adapter);//将adapter 添加到spinner中
spinnersetOnItemSelectedListener(new SpinnerSelectedListener()); //添加事件Spinner事件监听
3)新建Spinner监听器
class SpinnerSelectedListener implements OnItemSelectedListener{
public void onItemSelected(AdapterView<> arg0, View arg1, int arg2,
long arg3) {
viewsetText("你选择的值:"+m[arg2]);//设置编辑框为获取到的选择值
}
public void onNothingSelected(AdapterView<> arg0) {
}
}
在安卓客户端需要添加下拉框,供用户选择他们需要填写的选项。
如果使用资源文件把选项写死的话,只有text一种形式可选,局限太大,因此如果要实现 value - text 这种形式的话,需要单独写一个类 SpinnerOptionjava 。
1 布局文件
<Spinnerandroid:id="@+id/town_sp"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
2 下拉框选项实体 SpinnerOptionjava,在Spinner中显示选项的时候,默认会显示每个项(Object)的 toString() 之后的内容,因此重写 toString() 方法,让它输出 text 。
public class SpinnerOption {private String value = "";
private String text = "";
public SpinnerOption() {
value = "";
text = "";
}
public SpinnerOption(String value, String text) {
thisvalue = value;
thistext = text;
}
@Override
public String toString() {
return text;
}
public String getValue() {
return value;
}
public String getText() {
return text;
}
}
3 Fragment中:
ArrayList<SpinnerOption> towns;
//准备好下拉框内容
towns = new ArrayList<SpinnerOption>();
for (int i = 0; i < 18; i++) {
SpinnerOption c = new SpinnerOption(i + "", i + " 镇");
townsadd(c);
}
townSp = (Spinner)viewfindViewById(Ridtown_sp);
//设置Adapter
ArrayAdapter<SpinnerOption> townAdapter = new ArrayAdapter<SpinnerOption>(getActivity(),androidRlayoutsimple_spinner_item, towns);
townAdaptersetDropDownViewResource(androidRlayoutsimple_spinner_dropdown_item);
townSpsetAdapter(townAdapter);
//取下拉框的值
postDataput("townId", ((SpinnerOption)townSpgetSelectedItem())getValue());
在取值时要注意,getSelectedItem()得到的是笼统的Object对象而已,还需要把它转换类型为SpinnerOption类才能取值。
完成之后的效果:
import javautilArrayList;import javautilList;import androidappActivity;import androidosBundle;import androidviewView;import androidviewViewOnClickListener;import androidwidgetAdapterView;import androidwidgetAdapterViewOnItemSelectedListener;import androidwidgetArrayAdapter;import androidwidgetButton;import androidwidgetSpinner;import androidwidgetToast;/ 下拉列表显示 /public class SpinnerActivity extends Activity { //定义下拉列表 private Spinner spinner_info = null; //定义为下拉列表(spinner)添加一条信息的Button按钮 private Button btn_spinner_add = null; //定义为下拉列表(spinner)删除一条信息的Button按钮 private Button btn_spinner_del = null; //定义一个字符串数组 private String[] args = {"jinan","zhonggong","licheng"}; //内容适配器的数据源,由于用到了动态添加或删除下拉列表数据,因此数据源采用了动态list数组而非静态String数组 private List<String> list = null; //定义一个内容适配器 private ArrayAdapter<String> arrayAdapter = null; @Override protected void onCreate(Bundle savedInstanceState) { superonCreate(savedInstanceState); setContentView(Rlayoutactivity_spinner); //初始化控件信息 initView(); } / 初始化控件信息 / private void initView(){ //数据源添加数据 list = new ArrayList<String>(); for(String arg:args){ listadd(arg); } //spinner对象 spinner_info = (Spinner)findViewById(Ridspinner_info); //定义并初始化内容适配器,加载数据及样式,采用系统自带的样式 arrayAdapter = new ArrayAdapter<String>(SpinnerActivitythis,androidRlayoutsimple_spinner_item,list); //设置下拉列表的显示样式(风格),采用系统自带的样式(风格) arrayAdaptersetDropDownViewResource(androidRlayoutsimple_spinner_dropdown_item); //为下拉列表添加适配器 spinner_infosetAdapter(arrayAdapter); / 下拉列表选择事件 / spinner_infosetOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<> arg0, View arg1, int arg2, long a) { ToastmakeText(SpinnerActivitythis, "我点选了"+args[arg2]toString(), ToastLENGTH_SHORT)show(); } @Override public void onNothingSelected(AdapterView<> arg0) {} }); / 下拉列表(spinner)添加一条信息 / btn_spinner_add = (Button)findViewById(Ridbtn_spinner_add); btn_spinner_addsetOnClickListener(new OnClickListener() { @Override public void onClick(View v) {// String add_info = "我是新添加的数据"; //向内容适配器添加一条信息 arrayAdapteradd(add_info); //获取新添加的信息的位置 int position = arrayAdaptergetPosition(add_info); //设置新添加的信息为选中状态 spinner_infosetSelection(position); } }); / 下拉列表(spinner)删除一条信息 / btn_spinner_del = (Button)findViewById(Ridbtn_spinner_delete); btn_spinner_delsetOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //移除所选信息 arrayAdapterremove(spinner_infogetSelectedItem()toString()); } }); }}
以上就是关于如何让 EditText 在 Activity 启动时不获得焦点全部的内容,包括:如何让 EditText 在 Activity 启动时不获得焦点、android Spinner控件 选择后为什么会自动d到界面顶部、Android 怎么动态的设置Spinner联动等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)