日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

EditText图文混排

發布時間:2023/12/31 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 EditText图文混排 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

下面就具體說一下我遇到的問題,首先是EditText里面的圖文混排問題,這個問題的難點就是三點:

1.怎么插圖片?

2.怎么保存插入的圖片和文字?

3.怎么解析回圖片和文字

?

解決:

一.怎么插入圖片

?

在這里定義了兩個Button按鈕和一個EditText,插入圖片的話,就是點擊插入圖片按鈕然后從sd卡中選擇一張圖片出來。下面是實現代碼:

?

首先是button的監聽事件:

btn_insertImage.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubIntent getImage = new Intent(Intent.ACTION_GET_CONTENT);getImage.addCategory(Intent.CATEGORY_OPENABLE);getImage.setType("image/*");startActivityForResult(getImage, 1);}});

來分析一下代碼:

1.ACTION_GET_CONTENT是標準的Activity Action的一種,那什么是Activity Action呢,簡單來說就是讓用戶選擇一種特殊的數據并得到它。
2.通過以上分析,可以知道我們定義了這樣一個intent,要取得數據,取得數據要能夠被打開,且類型為image,這樣我們就可以執行了。
3.addCategory是要增加一個分類,增加一個什么分類呢?就是增加CATEGORY_OPENABLE,從字面意思值是增加一個可以打開的分類,也即是取得的uri要可以被ContentResolver解析,注意這里的分類即是執行的附加條件。
4.通過以上分析,可以知道我們定義了這樣一個intent,要取得數據,取得數據要能夠被打開,且類型為image,這樣我們就可以執行了。

@Overrideprotected void onActivityResult(int requestCode, int resultCode,Intent intent) {// TODO Auto-generated method stub super.onActivityResult(requestCode, resultCode, intent);ContentResolver resolver = getContentResolver();if (resultCode == RESULT_OK) {if (requestCode == 1) {originalUri = intent.getData();try {Bitmap originalBitmap = BitmapFactory.decodeStream(resolver.openInputStream(originalUri));bitmap = resizeImage(originalBitmap, 100, 100);} catch (FileNotFoundException e) {e.printStackTrace();}if (bitmap != null) {editText = (EditText) findViewById(R.id.edit);insertIntoEditText(getBitmapMime(bitmap, originalUri));} else {Toast.makeText(MainActivity.this, "獲取圖片失敗",Toast.LENGTH_SHORT).show();}}}if (bitmap != null) {}}

代碼分析:

1.首先使用intent.getData得到uri

2.然后調用BitmapFactory的解碼函數decodeStream且要求的參數為流(Stream),所以要用ContentResolver解析uri為流。

3.接著通過一個resizeImage函數重新調整bitmap大小,這里不再給出

4.然后就是要把所得到的圖片放到EditText里了

?

private SpannableString getBitmapMime(Bitmap pic, Uri uri) {String path = uri.getPath();SpannableString ss = new SpannableString(path);ImageSpan span = new ImageSpan(this, pic);ss.setSpan(span, 0, path.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);return ss;}

?

private void insertIntoEditText(SpannableString ss) {Editable et = editText.getText();// 先獲取Edittext中的內容int start = editText.getSelectionStart();et.insert(start, ss);// 設置ss要添加的位置editText.setText(et);// 把et添加到Edittext中editText.setSelection(start + ss.length());// 設置Edittext中光標在最后面顯示 }

代碼分析:

1.在getBitmapMime()中,首先建立一個SpannableString,r然后我們要給它附一張圖片,這張圖片來自我們的sd卡,然后是 setSpan()函數,這里有4個參數,分別是要插入的對象,起始位置,終止位置,標記,在本程序里插入的對象為一張圖片,起始位置為0,終止位置為 path的長度,標記為會刪除緩沖區里原有的text,這里即為path。

2.在insertIntoEditText()中,因為是動態添加,所以要用到Editable,然后先把ss添加到et里,然后在放到editText里,最后在設置一下光標的位置為最后

至此,插入圖片完成

二.?怎么保存圖片?

保存按鈕的監聽事件代碼:

Button btn_save = (Button) findViewById(R.id.save);btn_save.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubString content = editText.getText().toString();Bundle data = new Bundle();data.putString("nei", content);Intent intent = new Intent(MainActivity.this, Display.class);intent.putExtra("neirong", data);startActivity(intent);}});

代碼分析:

代碼非常簡單,我們只需保存editText里面的內容轉化成String存到content中,(注意:這里的圖片會變為它的路徑即為/mnt/sdcard/.........這樣的形式),

然后我們啟動另外一個Activity,這里當然也可以保存content到數據庫中。

至此,保存圖片完成

3.?怎么解析回圖片和文字

首先,我們有另外一個Activity,名字為display,注這里不在給圖,因為view里只有一個EditText

EditText display;@Override protected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stub super.onCreate(savedInstanceState);setContentView(R.layout.display);display = (EditText) findViewById(R.id.display);String imagePath = getIntent().getBundleExtra("neirong").getString("nei");SpannableString ss = new SpannableString(imagePath);Pattern p=Pattern.compile("/mnt/sdcard/.+?\\.\\w{3}");Matcher m=p.matcher(imagePath);while(m.find()){Bitmap bm = BitmapFactory.decodeFile(m.group());Bitmap rbm = resizeImage(bm, 100, 100);ImageSpan span = new ImageSpan(this, rbm);ss.setSpan(span, m.start(), m.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);}display.setText(ss); }

代碼分析:

首先取出上一個Activity里面的內容,保存到imagePath中,接下來就是把imagePath中的圖片改為圖片即可,同樣使用SpannableString,但怎么在一個很長的String中找到圖片的路徑呢,要使用正則表達式,這里是我寫的一個正則表達式/mnt/sdcard/.+?\\.\\w{3}寫的比較差,呵呵,通過正則表達式找到路徑,就可以在BitmapFactory中找到圖片,然后就可以利用setSpan()函數進行替換,最后在顯示出來。

至此,解析回圖片和文字完成


另外一種實現圖文混編的方式:是通過html的<img>標簽的方式插入到edittext中去:

標 記中有一個<img>標記。通過這個標記,可以很容易地實現將圖像插入到EditText的功能。不過使用<img>標簽要比使 用其他的標簽多一個步驟,這就是要實現一個ImageGetter接口,通過這個接口,可以獲得一個Drawable對象。先看看如下的代碼:

?

@Override public Drawable getDrawable(String source) { int id = Integer.parseInt(source); Drawable d = getResources().getDrawable(id); d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight()); return d; }

?

上面的代碼通過ImageGetter接口的getDrawable方法返回了一個Drawable對象,其中source參數的值就是<img>標簽的src屬性的值。我們需要通過如下的代碼來使用<img>標簽。

?

editText.append(Html.fromHtml("<imgsrc='"+ faces[new Random().nextInt(6)] +"'/>", imageGetter, null));

?

其 中faces是一個int類型數組,保存了相應的drawable資源的ID值。在使用<img>標簽之前需要使用 Html.fromHtml方法來封裝這些標簽,如果使用的是<img>標簽,需要使用fromHtml方法的第2個參數指定 ImageGetter對象,以便通過<img>標簽的src屬性獲得相應的Drawable對象。通過EditText.append方法 插入<img>標簽后,系統會自動將<img>標簽轉換成相應的圖像顯示在EditText中.

?

?

?

?

?

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的EditText图文混排的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。