Android 编辑框插入表情图片

首先,把整理好的表情图片以及布局用到的一些图片导入到项目的res/drawable目录中。

然后,编辑res/layout目录下布局.xml文件,这里我把oschina客户端的布局代码贴上来,供大家参考:
tweet_pub.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:background="@color/white">

    <FrameLayout
        android:id="@+id/tweet_pub_form"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_weight="1">

        <EditText
            android:id="@+id/tweet_pub_content"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:autoLink="web"
            android:gravity="top"
            android:hint="请输入动弹内容"
            android:background="@null"/>

        <ImageView
            android:id="@+id/tweet_pub_image"
            android:layout_width="60.0dip"
            android:layout_height="45.0dip"
            android:layout_marginLeft="5.0dip"
            android:layout_marginBottom="5.0dip"
            android:layout_gravity="left|bottom"
            android:clickable="true"
            android:visibility="gone"/>

        <LinearLayout
            android:id="@+id/tweet_pub_clearwords"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginRight="5.0dip"
            android:layout_marginBottom="5.0dip"
            android:layout_gravity="right|bottom"
            android:gravity="center"
            android:background="@drawable/clearwords_bg"
            android:clickable="true">
            <TextView
                android:id="@+id/tweet_pub_numberwords"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textColor="@color/black"
                android:text="160"/>
            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="3dip"
                android:src="@drawable/clearwords_icon"/>
        </LinearLayout>

    </FrameLayout>

    <include layout="@layout/tweet_pub_footer"/>

</LinearLayout>

tweet_pub_footer.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">   

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:background="@drawable/widget_bar_bg">
        <ImageView
            android:id="@+id/tweet_pub_footbar_face"
            style="@style/main_footbar_image"
            android:src="@drawable/widget_bar_face"/>
        <ImageView
            style="@style/main_footbar_cutline"
            android:src="@drawable/widget_bar_cut_off"/>
        <ImageView
            android:id="@+id/tweet_pub_footbar_photo"
            style="@style/main_footbar_image"
            android:src="@drawable/widget_bar_photo"/>
        <ImageView
            style="@style/main_footbar_cutline"
            android:src="@drawable/widget_bar_cut_off"/>
        <ImageView
            android:id="@+id/tweet_pub_footbar_atme"
            style="@style/main_footbar_image"
            android:src="@drawable/widget_bar_atme"/>
        <ImageView
            style="@style/main_footbar_cutline"
            android:src="@drawable/widget_bar_cut_off"/>
        <ImageView
            android:id="@+id/tweet_pub_footbar_software"
            style="@style/main_footbar_image"
            android:src="@drawable/widget_bar_soft"/>
    </LinearLayout>

    <GridView
        android:id="@+id/tweet_pub_faces"
        android:layout_width="fill_parent"
        android:layout_height="220dip"
        android:numColumns="auto_fit"
        android:columnWidth="50dip"
        android:stretchMode="columnWidth"
        android:gravity="center"
        android:fadingEdge="none"
        android:scrollingCache="false"
        android:background="@color/face_bg"
        android:visibility="gone"/>

</LinearLayout>

通过上面布局代码可以看出,我把整个编辑界面分成了2个.xml文件。主布局文件tweet_pub.xml通过<include>标签把底 部工具栏tweet_pub_footer.xml加载进视图。这样做的好处是把一个较复杂的布局细分成几个小布局,让布局更清晰,维护起来更加方便。

接下来,创建一个Activity类,并在AndroidManifest.xml中注册,对该Activity添加一个属性:

android:windowSoftInputMode="stateVisible|adjustResize"

该属性在Activity启动显示的时候,软键盘也自动弹出显示,这样方便用户可直接对EditText编辑框进行输入文字操作。

下面贴出Activity的完整代码:

public class MainActivity extends Activity {

    private EditText mContent;
    private ImageView mFace;
    private LinearLayout mClearwords;
    private TextView mNumberwords;

    private GridView mGridView;
    private GridViewFaceAdapter mGVFaceAdapter;

    private InputMethodManager imm;

    private static final int MAX_TEXT_LENGTH = 160;//最大输入字数

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.tweet_pub);

        //软键盘管理类
        imm = (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);

        //初始化基本视图
        this.initView();

        //初始化表情视图
        this.initGridView();
    }

    //初始化视图控件
    private void initView()
    {
        mContent = (EditText)findViewById(R.id.tweet_pub_content);
        mFace = (ImageView)findViewById(R.id.tweet_pub_footbar_face);
        mClearwords = (LinearLayout)findViewById(R.id.tweet_pub_clearwords);
        mNumberwords = (TextView)findViewById(R.id.tweet_pub_numberwords);

        //设置控件点击事件
        mFace.setOnClickListener(faceClickListener);
        mClearwords.setOnClickListener(clearwordsClickListener);

        //编辑器添加文本监听
        mContent.addTextChangedListener(new TextWatcher() {
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                //显示剩余可输入的字数
                mNumberwords.setText((MAX_TEXT_LENGTH - s.length()) + "");
            }
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
            public void afterTextChanged(Editable s) {}
        });
        //编辑器点击事件
        mContent.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                //显示软键盘
                showIMM();
            }
        });
        //设置最大输入字数
        InputFilter[] filters = new InputFilter[1];
        filters[0] = new InputFilter.LengthFilter(MAX_TEXT_LENGTH);
        mContent.setFilters(filters);
    }

    //初始化表情控件
    private void initGridView() {
        mGVFaceAdapter = new GridViewFaceAdapter(this);
        mGridView = (GridView)findViewById(R.id.tweet_pub_faces);
        mGridView.setAdapter(mGVFaceAdapter);
        mGridView.setOnItemClickListener(new AdapterView.OnItemClickListener(){
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                //插入的表情
                SpannableString ss = new SpannableString(view.getTag().toString());
                Drawable d = getResources().getDrawable((int)mGVFaceAdapter.getItemId(position));
                d.setBounds(0, 0, 35, 35);//设置表情图片的显示大小
                ImageSpan span = new ImageSpan(d, ImageSpan.ALIGN_BOTTOM);
                ss.setSpan(span, 0, view.getTag().toString().length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                //在光标所在处插入表情
                mContent.getText().insert(mContent.getSelectionStart(), ss);
            }
        });
    }

    private void showIMM() {
        mFace.setTag(1);
        showOrHideIMM();
    }
    private void showFace() {
        mFace.setImageResource(R.drawable.widget_bar_keyboard);
        mFace.setTag(1);
        mGridView.setVisibility(View.VISIBLE);
    }
    private void hideFace() {
        mFace.setImageResource(R.drawable.widget_bar_face);
        mFace.setTag(null);
        mGridView.setVisibility(View.GONE);
    }
    private void showOrHideIMM() {
        if(mFace.getTag() == null){
            //隐藏软键盘
            imm.hideSoftInputFromWindow(mFace.getWindowToken(), 0);
            //显示表情
            showFace();
        }else{
            //显示软键盘
            imm.showSoftInput(mContent, 0);
            //隐藏表情
            hideFace();
        }
    }

    //表情控件点击事件
    private View.OnClickListener faceClickListener = new View.OnClickListener() {
        public void onClick(View v) {
            showOrHideIMM();
        }
    };

    //清除控件点击事件
    private View.OnClickListener clearwordsClickListener = new View.OnClickListener() {
        public void onClick(View v) {
            String content = mContent.getText().toString();
            if(content != ""){
                AlertDialog.Builder builder = new AlertDialog.Builder(v.getContext());
                builder.setTitle("清除文字吗?");
                builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                        //清除文字
                        mContent.setText("");
                        mNumberwords.setText(String.valueOf(MAX_TEXT_LENGTH));
                    }
                });
                builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                    }
                });
                builder.show();
            }
        }
    };
}

这里说明下,GridViewFaceAdapter类是我自定义的适配器类,继承了BaseAdapter。下面我也将该类的完整代码贴出来,给大家参考:

public class GridViewFaceAdapter extends BaseAdapter
{
    // 定义Context
    private Context mContext;
    // 定义整型数组 即图片源
    private int[] mImageIds;

    public GridViewFaceAdapter(Context c)
    {
        mContext = c;
        mImageIds = new int[]{
            R.drawable.f001,R.drawable.f002,R.drawable.f003,R.drawable.f004,R.drawable.f005,R.drawable.f006,
            R.drawable.f007,R.drawable.f008,R.drawable.f009,R.drawable.f010,R.drawable.f011,R.drawable.f012,
            R.drawable.f013,R.drawable.f014,R.drawable.f015,R.drawable.f016,R.drawable.f017,R.drawable.f018,
            R.drawable.f019,R.drawable.f020,R.drawable.f021,R.drawable.f022,R.drawable.f023,R.drawable.f024,
            R.drawable.f025,R.drawable.f026,R.drawable.f027,R.drawable.f028,R.drawable.f029,R.drawable.f030,
            R.drawable.f031,R.drawable.f032,R.drawable.f033,R.drawable.f034,R.drawable.f035,R.drawable.f036,
            R.drawable.f037,R.drawable.f038,R.drawable.f039,R.drawable.f040,R.drawable.f041,R.drawable.f042,
            R.drawable.f043,R.drawable.f044,R.drawable.f045,R.drawable.f046,R.drawable.f047,R.drawable.f048,
            R.drawable.f049,R.drawable.f050,R.drawable.f051,R.drawable.f052,R.drawable.f053,R.drawable.f054,
            R.drawable.f055,R.drawable.f056,R.drawable.f057,R.drawable.f058,R.drawable.f059,R.drawable.f060,
            R.drawable.f061,R.drawable.f062,R.drawable.f063,R.drawable.f064,R.drawable.f065,R.drawable.f067,
            R.drawable.f068,R.drawable.f069,R.drawable.f070,R.drawable.f071,R.drawable.f072,R.drawable.f073,
            R.drawable.f074,R.drawable.f075,R.drawable.f076,R.drawable.f077,R.drawable.f078,R.drawable.f079,
            R.drawable.f080,R.drawable.f081,R.drawable.f082,R.drawable.f083,R.drawable.f084,R.drawable.f085,
            R.drawable.f086,R.drawable.f087,R.drawable.f088,R.drawable.f089,R.drawable.f090,R.drawable.f091,
            R.drawable.f092,R.drawable.f093,R.drawable.f094,R.drawable.f095,R.drawable.f096,R.drawable.f097,
            R.drawable.f098,R.drawable.f099,R.drawable.f100,R.drawable.f101,R.drawable.f103,R.drawable.f104,
            R.drawable.f105
        };
    }

    // 获取图片的个数
    public int getCount()
    {
        return mImageIds.length;
    }

    // 获取图片在库中的位置
    public Object getItem(int position)
    {
        return position;
    }

    // 获取图片ID
    public long getItemId(int position)
    {
        return mImageIds[position];
    }

    public View getView(int position, View convertView, ViewGroup parent)
    {
        ImageView imageView;
        if (convertView == null)
        {
            imageView = new ImageView(mContext);
            // 设置图片n×n显示
            imageView.setLayoutParams(new GridView.LayoutParams(85, 85));
            // 设置显示比例类型
            imageView.setScaleType(ImageView.ScaleType.CENTER);
        }
        else
        {
            imageView = (ImageView) convertView;
        }

        imageView.setImageResource(mImageIds[position]);
        if(position < 65)
            imageView.setTag("["+position+"]");
        else if(position < 100)
            imageView.setTag("["+(position+1)+"]");
        else
            imageView.setTag("["+(position+2)+"]");

        return imageView;
    }

}

对上面GridViewFaceAdapter类的代码做下说明:
1.我将所有的表情图片对应的资源ID,用一个整数数组封装了。
2.getView方法里的下面这段代码:

mageView.setImageResource(mImageIds[position]);
if(position < 65)
    imageView.setTag("["+position+"]");
else if(position < 100)
    imageView.setTag("["+(position+1)+"]");
else
    imageView.setTag("["+(position+2)+"]");

代码:这里

时间: 2024-10-02 15:29:26

Android 编辑框插入表情图片的相关文章

Android笔记:TextView和编辑框中添加图片,ImageSpan,SpannableStringBuilder用法

在TextView或者编辑框EditText中添加图片的方法,代码如下: import java.util.regex.Matcher; import java.util.regex.Pattern; import android.os.Bundle; import android.app.Activity; import android.text.Spannable; import android.text.SpannableStringBuilder; import android.text

在EditText中插入表情图片 (CharacterStyle&amp;SpannableString)

EditText通常用于显示文字,但有时候也需要在文字中夹杂一些图片,比如QQ中就可以使用表情图片,又比如需要的文字高亮显示等等,如何在android中也做到这样呢? 记得android中有个android.text包,这里提供了对文本的强大的处理功能. 添加图片主要用SpannableString和ImageSpan类: Java代码   Drawable drawable = getResources().getDrawable(id); drawable.setBounds(0, 0, d

Android 编辑框(EditText)属性学习

EditText的属性很多,这里介绍几个:android:hint="请输入数字!"//设置显示在空间上的提示信息android:numeric="integer"//设置只能输入整数,如果是小数则是:decimalandroid:singleLine="true"//设置单行输入,一旦设置为true,则文字不会自动换行.android:password="true"//设置只能输入密码android:textColor =

Android编辑框被输入法遮盖,有效的处理办法

出现这个问题, 主要是在4.4之后, 允许使用沉浸式标题栏后, 4.4之前的 或 4.4之后没有使用沉浸式标题栏的 都没问题, 所以, 如果 你的app使用沉浸式标题栏, 并且 需要输入内容, 就可以用这个办法 1.在xml中主体部分的外面加一层ScrollView,就是图中红线圈中的地方 2. 在activity的onCreate中 加入这段代码 if (Build.VERSION.SDK_INT >= 19) { final View decorView = getWindow().getD

Android -- 编辑框更改样式

1. 效果图 2. 实现代码 activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <EditText android:id="@+id/txt

如何写一个发微博的页面(包括插入图片,插入表情,插入话题,插入Location) (一)

先上效果图: 先看页面布局: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"

Android EditText插入表情(字符串)到光标位置

前言 之前写的一个Android应用,在回复帖子插入表情的时候存在一个BUG,就是无法在EditText中指定的光标处插入表情字符串,每次添加的表情字符串都跑到了文字末尾.分析了一下apk源码,发现是在表情盘的onClick响应事件中没有正确处理表情字符串的添加方法,这里记录一下如何在EditText指定光标处插入表情字符串. EditText光标处插入表情字符串的方法 既然是在EditText控件中插入表情字符串,那首先需要获取EditText控件对象,示例源码如下: EditText rEd

自定义编辑框VC,可加载更改字体,添加背景图片,显示输入提示信息

搞了一天终于弄了个完整的编辑框控件出来了, 哎,,,搞界面开发还是有点复杂的. 1 #pragma once 2 3 #include "AdvEdit.h" 4 // CBkgEditBox 5 6 class CBkgEditBox : public CEdit 7 { 8 DECLARE_DYNAMIC(CBkgEditBox) 9 10 public: 11 CBkgEditBox(); 12 virtual ~CBkgEditBox(); 13 14 protected: 1

第6章、编辑框EditText与按钮Button(从零开始学Android)

在一个应用中,登录是经常使用的,下面我们学习一下如何开发一个登录窗口.我们需要学习Android中的基本控件:(1)EditText编辑框.(2)Button按钮. 一.设计登录窗口 打开"res/layout/activity_main.xml"文件. 1.分别从工具栏向activity拖出2个EditText(来自Text Fields).1个按钮(来自Form Widgets). 2.打开activity_main.xml文件. 代码自动生成如下:注意①和②虽同为EditText