ListView 与EditText共存的焦点问题

这里要实现的功能是文件管理器中的重命名,根据选择的文件名,进入到重命名对话框。用ListView存放所有的文件名,EditText来书写新的文件名,然后保存。

首先,这里需要自定义ListView适配器,继承baseAdapter,重写getView()方法,该方法在列表视图上的任何操作都会让它执行。

下面是getView的方法内容

RenameHolder holder = null;

if (view == null)
{
holder = new RenameHolder();
if (view == null)
{
view = inflater.inflate(R.layout.rename_data, null);
}
holder.tv = (TextView) view.findViewById(R.id.name);
holder.et = (EditText) view.findViewById(R.id.edit);
view.setTag(holder);
}
else
{
holder=(RenameHolder)view.getTag();
}

HashMap<String, String> map = list.get(position);
if (map != null)
{
itemString = (String) map.get(keyString[0]);
holder.tv.setText(itemString);
holder.et.setText(isSelected.get(position));
}
holder.et.setOnKeyListener(new OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
EditText EditText = (EditText)v;
newname[pos] = EditText.getText().toString().trim();
//System.out.println(pos + “——” + newname[pos]);
return false;
}
});
return view;
}

而关键是点击焦点的时候,如果EditText设置了android:focusable=”false”,android:focusableInTouchMode=”false”,android:clickable=”false”

你是无法获取到EditText的焦点的,因为此时ListView会优先控制,我需要在ListView中的setOnItemClickListener方法中,获取到你当前选中的是第几项,然后将焦点切换到EditText中,

将LayoutInflater转化到Listview.xml中,获取到ListView控件,

LayoutInflater inflater = getLayoutInflater();
View view = inflater.inflate(R.layout.rename,(ViewGroup) findViewById(R.id.dialog));
Renamelistdata = (ListView)view.findViewById(R.id.ListView);

而在Activity界面想要获取到EditText控件,

RenameHolder holder = (RenameHolder) view.getTag(); 这步很关键,获取到EditText界面的View
holder.et.setFocusable(true);
holder.et.setFocusableInTouchMode(true);
holder.et.setClickable(true);
holder.et.requestFocus();

监听EditText键盘输入事件,getText(),得到新的文件名,最后通过file.rename(File file)方法重命名文件。

这里仍有一个小问题,点击ListView然后将焦点切换到EditText是无奈之举,因为我需要知道当前点击的是listView中的第几项,而不知道有没有方法可以将焦点直接放在EditText中,从而能知道当前点击的是第几项,有没有什么寻找父控件的方法,求指教!!

标签