如何获取edittext游标的绝对屏幕位置?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何获取edittext游标的绝对屏幕位置?相关的知识,希望对你有一定的参考价值。

我想在EditText中检索当前光标Y位置以显示片段列表(根据此Y设置位置);我想做同样的行为,如提到Facebook App中的列表:

enter image description here

所以我这样做了:

    int pos = editText.getSelectionStart();
    Layout layout = editText.getLayout();
    int line = layout.getLineForOffset(pos);
    int baseline = layout.getLineBaseline(line);
    int ascent = layout.getLineAscent(line);

    int location[] = new int[2];
    editText.getLocationOnScreen(location);     

    Point point = new Point();
    point.x = (int) layout.getPrimaryHorizontal(pos);
    point.y = baseline + ascent + location[1];

它正常工作但是当滚动到我的EditText时,位置Y(point.y)变得不正确......我无法理解如何在所有情况下都具有完全绝对的Y(进入屏幕)(有/无滚动)。

非常感谢你们!

答案

你可以使用AutoCompleteTextView和自定义List Adapter来做到这一点。

这是一个例子:

在您的活动/片段中:

AutoCompleteTextView textView = (AutoCompleteTextView) findViewById(R.id.tv_users);
CustomAdapter<User> adapter = new CustomAdapter<User>(this, R.layout.user_row, usersList);
textView.setAdapter(adapter);

创建对象用户:

public class User {
  public String name;
  public Bitmap image;

  public User(String name, Bitmap image) {
    this.name = name;
    this.image= image;
  }
}

创建行布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent" >
  <ImageView
    android:id="@+id/image"
    android:layout_height="wrap_content" 
    android:src="@drawable/icon"
    android:scaleType="center"/>
  <TextView
    android:id="@+id/user_name"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Name" />
</LinearLayout>

创建一个新的类CustomAdapter,它为对象User扩展ArrayAdapter

public class CustomAdapter extends ArrayAdapter<User> {
  public CustomAdapter(Context context, int layout, ArrayList<User> users) {
    super(context, layout, users);
  }

  @Override
  public View getView(int position, View convertView, ViewGroup parent) {
    // Get the user for this position
    User user = getItem(position);

    TextView userName = (TextView) convertView.findViewById(R.id.user_name);
    ImageView image = (ImageView) convertView.findViewById(R.id.image);

    userName.setText(user.name);
    image.setImageBitmap(user.image);

    return convertView;
 }
}
另一答案

有一个类似的问题 - 你可以通过使用editText.getScrollY()(它返回edittext的滚动的Y偏移,以像素为单位)来解决这个问题。

所以在你的情况下:

point.y = baseline + ascent + location[1] - editText.getScrollY();

以上是关于如何获取edittext游标的绝对屏幕位置?的主要内容,如果未能解决你的问题,请参考以下文章

OSX / Cocoa:获取屏幕中docktile图标的绝对位置[重复]

如何在android中使用游标(sqlite查询)搜索数据库

Android EditText,让它填满整个屏幕并在其中任意位置书写

如何获取 UITableView 单元格中的 UIButton 的绝对 x,y

如何获得 Recyclerview 项目中所有 Edittext 的总和?仅获取屏幕上可见的项目,而不是全部

Android:获取View视图在屏幕绝对位置和坐标方法总结