如何让 EditText 在 Activity 启动时不获得焦点

如何让 EditText 在 Activity 启动时不获得焦点,第1张

如何让 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 布局文件

<Spinner   

           android: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联动等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/web/9289206.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-26
下一篇2023-04-26

发表评论

登录后才能评论

评论列表(0条)

    保存