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 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中,从而能知道当前点击的是第几项,有没有什么寻找父控件的方法,求指教!!



你可能感兴趣的:(Android)