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

时间:2017-12-03 15:17:52

标签: android android-edittext screen

我想在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(进入屏幕)所有情况(有/无滚动)。

非常感谢你们!

2 个答案:

答案 0 :(得分:1)

您可以将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;
 }
}

答案 1 :(得分:0)

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

所以在你的情况下:

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