EditText画像を挿入してアクセス

8710 ワード

ここでは2つのButtonボタンと1つのEditTextを定義し、画像を挿入すると、画像を挿入するボタンをクリックしてsdカードから1枚の画像を選択します.実装コードは次のとおりです.まずbuttonのリスニングイベントです.
btn_insertImage.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Intent getImage = new Intent(Intent.ACTION_GET_CONTENT);
                getImage.addCategory(Intent.CATEGORY_OPENABLE);
                getImage.setType("image/*");
                startActivityForResult(getImage, 1);
            }
        });

コード解析:ACTION_GET_CONTENTは標準的なActivity Actionの一種で、Activity Actionとは何か、簡単に言えばユーザーに特殊なデータを選択させ、それを得ることです.ACTION_GET_CONTENTは、ユーザーが実行しているプログラムからデータを取得することができ、例えば写真を取ることができます.もちろん、ここで実行しているプログラムは携帯電話のファイルマネージャなどを指します.addCategoryは分類を追加し、どのような分類を追加しますか?CATEGORYを増やすことですOPENABLEでは,文字通りの意味値から開くことができる分類,すなわち取得したuriをContentResolverで解析できるようにするが,ここでの分類は実行の付加条件であることに注意する.settypeとは,取得したデータ型をimage,すなわち写真をとるように設定する.以上の解析から,データを取得するには,データを開くことができ,タイプがimageであるというintentを定義し,実行できることが分かった.
@Override
    protected 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関数で再調整し、ここでは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 
}

コード分析:getBitmapMime()では、まずSpannablesStringを確立し、rそれから私たちはそれに画像を添付します.この画像は私たちのsdカードから来て、setSpan()関数で、ここには4つのパラメータがあります.ここには4つのパラメータがあります.それぞれ挿入するオブジェクト、開始位置、終了位置、マーク、このプログラムに挿入するオブジェクトは1枚の画像で、開始位置は0で、終了位置はpathの長さです.バッファ内の既存のtextが削除されるとマークされます.ここでpathです.InsertIntoEditText()では、動的に追加するのでEditableを使い、まずssをetに追加してeditTextに入れ、最後にカーソルをセットした位置で最後まで画像を挿入して完成
  • どのように画像を保存しますか?保存ボタンのリスニングイベントコード:
  • Button btn_save = (Button) findViewById(R.id.save);
            btn_save.setOnClickListener(new OnClickListener() {
    
                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    String 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をデータベースに保存することもできます.これで、画像の保存が完了しました
  • 画像と文字をどのように解析するかまず、私たちはもう一つのActivityを持っています.名前はdisplayです.注ここには図がありません.viewにはEditText
  • が1つしかありませんから.
    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()関数で置き換えることができ、最後に表示されます.これで、画像と文字の解析が完了します.