EditText 不支持直接嵌入按鈕、VideoView 等 View 控件。它僅支持:
EditText editText = findViewById(R.id.editText);
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_image);
bitmap = Bitmap.createScaledBitmap(bitmap, 64, 64, true);
ImageSpan imageSpan = new ImageSpan(this, bitmap, ImageSpan.ALIGN_BASELINE);
SpannableString spannable = new SpannableString("圖片佔位符"); // 佔位字符
spannable.setSpan(imageSpan, 0, spannable.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
editText.setText(spannable);
// 或追加
editText.append(spannable);
類似微信聊天界面,每條消息是一個 Item,支持文本、圖片、按鈕、視頻等任意 View:
// Adapter 多類型示例
class ChatAdapter extends RecyclerView.Adapter {
static final int TYPE_TEXT = 0, TYPE_IMAGE = 1, TYPE_BUTTON = 2, TYPE_VIDEO = 3;
@Override
public int getItemViewType(int position) {
return items.get(position).type;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
switch(viewType) {
case TYPE_BUTTON: return new ButtonHolder(inflate(R.layout.item_button));
case TYPE_VIDEO: return new VideoHolder(inflate(R.layout.item_video));
// ...
}
}
}
WebView webView = findViewById(R.id.webView);
webView.getSettings().setJavaScriptEnabled(true);
webView.loadDataWithBaseURL(null, htmlContent, "text/html", "utf-8", null);
// HTML 中可放任意
<LinearLayout
android:orientation="vertical">
<!-- 消息列表 -->
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rvMessages"
android:layout_weight="1" />
<!-- 底部輸入區 -->
<LinearLayout
android:orientation="horizontal"
android:padding="8dp">
<ImageButton android:id="@+id/btnAttach" android:src="@drawable/ic_attach" />
<EditText
android:id="@+id/etInput"
android:layout_weight="1"
android:hint="輸入消息..." />
<Button
android:id="@+id/btnSend"
android:text="發送" />
</LinearLayout>
</LinearLayout>
點擊附件按鈕彈出選單(拍照、相冊、視頻、位置等),選擇後添加到 RecyclerView,而非塞入 EditText。
| 需求 | 可行性 | 推薦方案 |
|---|---|---|
| 嵌入圖片 | ✅ 原生支持 | ImageSpan + SpannableString |
| 嵌入按鈕 | ❌ 不支持 | RecyclerView 多類型 Item |
| 嵌入視頻播放 | ❌ 不支持 | RecyclerView + VideoView/ExoPlayer Item |
| 富文本編輯 | ⚠️ 受限 | RichEditor 庫 或 WebView |
現代 IM/社交應用均采用 RecyclerView 多類型列表 而非單一 EditText 實現複雜消息混排。