【发布时间】:2020-11-13 02:24:39
【问题描述】:
我正在为一个应用项目做贡献,但我遇到了这个问题。
我有一个带有 ArrayAdapter 项目列表的 Horizontal LinearLayout:image -- EditText -- image
我使用 EditText 来启用水平滚动长文本字段,同时禁用光标和单击事件。父布局需要管理项目上的点击事件+水平滑动以更改主视图中的选项卡
代码运行正常:
- 如果 EditText 有很长的文本:我可以水平滚动文本以阅读全部内容。在文本的末尾,父布局进行滑动并可以更改选项卡
- 我可以长按 EditText 以启用父布局中的选择复选标记
- 光标和滑块正确隐藏在 EditText 中
唯一的问题是 EditText 使用简单的点击事件并且从不将它们传递给父布局。当我单击图像或单击 EditText 的右侧/左侧时,父布局会正确捕获适配器项上的单击操作。如果我直接单击 EditText,则事件被消耗并且永远不会到达父布局 setOnItemClickListener。
这是一个简短的视频,介绍了它现在的工作方式。视频中10秒位置的点击必须在文字外进行:https://www.youtube.com/watch?v=P306p7AcwAI
<LinearLayout
android:id="@+id/profile_list_sync_layout"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginRight="5dp"
android:layout_marginLeft="5dp" >
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<ImageView
android:id="@+id/sync_task_master_icon"
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_gravity="center_vertical|top"
android:src="@drawable/ic_16_server" />
<EditText
android:id="@+id/sync_task_master_info"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:inputType="none"
android:background="@android:color/transparent"
android:cursorVisible="false"
android:clickable="false"
android:focusable="false"
android:focusableInTouchMode="false"
android:singleLine="true"
android:ellipsize="end"
android:lines="1"
android:text="Master"
android:textAppearance="?android:attr/textAppearanceSmall" />
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<ImageView
android:id="@+id/sync_task_direction_image"
android:layout_width="12dp"
android:layout_height="18dp"
android:layout_gravity="center"
android:scaleType="fitXY"
android:src="@drawable/arrow_right_enabled" />
<ImageView
android:id="@+id/sync_task_target_icon"
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_gravity="top"
android:src="@drawable/ic_16_server" />
<EditText
android:id="@+id/sync_task_target_info"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:inputType="none"
android:background="@android:color/transparent"
android:cursorVisible="false"
android:clickable="false"
android:focusable="false"
android:focusableInTouchMode="false"
android:singleLine="true"
android:ellipsize="end"
android:lines="1"
android:text="Target"
android:textAppearance="?android:attr/textAppearanceSmall" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
public class AdapterSyncTask extends ArrayAdapter<SyncTaskItem> {
final public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
final SyncTaskItem o = getItem(position);
View v = convertView;
if (v == null) {
LayoutInflater vi = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(id, null);
holder = new ViewHolder();
holder.tv_row_master = (EditText) v.findViewById(R.id.sync_task_master_info);
holder.tv_row_target = (EditText) v.findViewById(R.id.sync_task_target_info);
}
if (o != null) {
holder.tv_row_master.setText("source dir path");
holder.tv_row_master.setInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS); //disable auto-correct highlight in EditText
holder.tv_row_target.setText(destination dir path);
holder.tv_row_target.setTextColor(mTextColor);
holder.tv_row_target.setInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS); //disable auto-correct highlight in EditText
}
return v;
}
static class ViewHolder {
EditText tv_row_master, tv_row_target;
}
}
以及需要 onClick 事件的 ActivityMain: https://github.com/PhilZ-cwm6/SMBSync2/blob/philz/SMBSync2/src/main/java/com/sentaroh/android/SMBSync2/ActivityMain.java
private void setSyncTaskListItemClickListener() {
mGp.syncTaskListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
SyncTaskItem item = mGp.syncTaskAdapter.getItem(position);
editSyncTask(item.getSyncTaskName(), item.isSyncTaskAuto(), position);
}
});
}
这些都是非常简单的sn-ps代码
基本上,原始代码与 TextView 一起正常工作,但无法在一行中查看/滚动长文本路径。使用 HorizontalScrollView 也可以,但不会传递任何事件,如果单击发生在文本字段上,则包括滑动和长按到父级。
EditText 技巧修复了所有在 EditTex 框上发生的简单单击事件之外的所有事件。有线,因为长触摸和滑动正确传递。此外,setOnItemClickListener 在单击 EditText 时不会捕获任何事件,但如果它是 TextView 则会捕获它们
知道如何解决这个问题吗?我考虑过自定义 EditText,但最终不确定 ArrayAdapter 如何获得 EditText 位置。我是否必须为 EditText 使用第二个适配器?
最好的问候
编辑:我可以将此代码添加到适配器的 getView() 中:
holder.tv_row_target.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//click events of EditText are captured
}
});
但是,我无法将它们从 onClick() 传播到 ListView 或父视图
这将避免基于父级在单击时应执行的操作而对代码进行大量重写
【问题讨论】:
-
你检查
android:editable="false"了吗? -
我刚试过
android:editable="false",但没有帮助。 OnClick 事件由 EditText 使用
标签: android android-layout onclick android-edittext horizontalscrollview