目前,各种App的社区或者用户晒照片、发说说的地方,都提供了评论功能,为了更好地学习,自己把这个功能实现了一下,做了个小的Demo。


首先推荐一款实用的插件LayoutCreater,可以帮助开发者自动生成布局代码,具体用法可以去GiHub上看看:

GitHub地址:https://github.com/boredream/BorePlugin




附上这个Demo的源码:https://github.com/yeaper/android_sample/tree/master/InputDemo


1、新建一个Android工程,写MainActivity的布局 activity_main.xml


                                                                        



2、创建评论内容实体类、 内容适配器、内容的Item布局


1)内容实体类 Comment

public class Comment {    String name; //评论者    String content; //评论内容    public Comment(){            }    public Comment(String name, String content){        this.name = name;        this.content = content;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getContent() {        return content;    }    public void setContent(String content) {        this.content = content;    }}



2)内容适配器 AdapterComment

public class AdapterComment extends BaseAdapter {    Context context;    List data;    public AdapterComment(Context c, List data){        this.context = c;        this.data = data;    }    @Override    public int getCount() {        return data.size();    }    @Override    public Object getItem(int i) {        return data.get(i);    }    @Override    public long getItemId(int i) {        return i;    }    @Override    public View getView(int i, View convertView, ViewGroup viewGroup) {        ViewHolder holder;        // 重用convertView        if(convertView == null){            holder = new ViewHolder();            convertView = LayoutInflater.from(context).inflate(R.layout.item_comment, null);            holder.comment_name = (TextView) convertView.findViewById(R.id.comment_name);            holder.comment_content = (TextView) convertView.findViewById(R.id.comment_content);            convertView.setTag(holder);        }else{            holder = (ViewHolder) convertView.getTag();        }        // 适配数据        holder.comment_name.setText(data.get(i).getName());        holder.comment_content.setText(data.get(i).getContent());        return convertView;    }    /**     * 添加一条评论,刷新列表     * @param comment     */    public void addComment(Comment comment){        data.add(comment);        notifyDataSetChanged();    }    /**     * 静态类,便于GC回收     */    public static class ViewHolder{        TextView comment_name;        TextView comment_content;    }}


3)内容的Item布局 item_comment.xml

        




3、在MainActivity选中布局,然后菜单栏点击 Code —> LayoutCreater,确定要生成的布局代码后,点击confirm完成




接下来再完善,具体的实现我已经在代码中做了注释,就不具体说了

public class MainActivity extends Activity implements View.OnClickListener {    private ImageView comment;    private TextView hide_down;    private EditText comment_content;    private Button comment_send;    private LinearLayout rl_enroll;    private RelativeLayout rl_comment;    private ListView comment_list;    private AdapterComment adapterComment;    private List data;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initView();    }    private void initView() {        // 初始化评论列表        comment_list = (ListView) findViewById(R.id.comment_list);        // 初始化数据        data = new ArrayList<>();        // 初始化适配器        adapterComment = new AdapterComment(getApplicationContext(), data);        // 为评论列表设置适配器        comment_list.setAdapter(adapterComment);        comment = (ImageView) findViewById(R.id.comment);        hide_down = (TextView) findViewById(R.id.hide_down);        comment_content = (EditText) findViewById(R.id.comment_content);        comment_send = (Button) findViewById(R.id.comment_send);        rl_enroll = (LinearLayout) findViewById(R.id.rl_enroll);        rl_comment = (RelativeLayout) findViewById(R.id.rl_comment);        setListener();    }    /**     * 设置监听     */    public void setListener(){        comment.setOnClickListener(this);        hide_down.setOnClickListener(this);        comment_send.setOnClickListener(this);    }    @Override    public void onClick(View v) {        switch (v.getId()) {            case R.id.comment:                // 弹出输入法                InputMethodManager imm = (InputMethodManager) getApplicationContext().getSystemService(Context.INPUT_METHOD_SERVICE);                imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);                // 显示评论框                rl_enroll.setVisibility(View.GONE);                rl_comment.setVisibility(View.VISIBLE);                break;            case R.id.hide_down:                // 隐藏评论框                rl_enroll.setVisibility(View.VISIBLE);                rl_comment.setVisibility(View.GONE);                // 隐藏输入法,然后暂存当前输入框的内容,方便下次使用                InputMethodManager im = (InputMethodManager)getApplicationContext().getSystemService(Context.INPUT_METHOD_SERVICE);                im.hideSoftInputFromWindow(comment_content.getWindowToken(), 0);                break;            case R.id.comment_send:                sendComment();                break;            default:                break;        }    }    /**     * 发送评论     */    public void sendComment(){        if(comment_content.getText().toString().equals("")){            Toast.makeText(getApplicationContext(), "评论不能为空!", Toast.LENGTH_SHORT).show();        }else{            // 生成评论数据            Comment comment = new Comment();            comment.setName("评论者"+(data.size()+1)+":");            comment.setContent(comment_content.getText().toString());            adapterComment.addComment(comment);            // 发送完,清空输入框            comment_content.setText("");            Toast.makeText(getApplicationContext(), "评论成功!", Toast.LENGTH_SHORT).show();        }    }}



注意:

因为Android 手机类型比较杂,所以有的手机中会出现底部输入框和输入法重叠,如下图,画红圈的这部分是没有的:



当出现这个问题时,可以在Manifest.xml文件中,给对应的Activity添加一条属性

android:windowSoftInputMode="stateHidden|adjustResize"

这样,输入法就可以自动调节,显示画红圈的部分,底部输入框和输入法就不会重叠了。


4、最后的效果图如下


隐藏输入框的界面


显示输入框的界面






更多相关文章

  1. ReactNative之Android绝对布局position:'absolute'问题
  2. Android(安卓)Reveal圆形Activity转场动画
  3. Android中Fragment的使用
  4. Android(安卓)中自定义View的应用.
  5. Android中各种Adapter的使用方法
  6. Tangram 的基础 —— vlayout(Android)
  7. Android网格布局(GirdView)学习
  8. Android开发中的autocomplete控件
  9. 关于android的输入法弹出来 覆盖输入框的问题

随机推荐

  1. android颜色对应的xml配置值
  2. Android RelativeLayout 相对布局
  3. android tabhost
  4. Android Input Event Dispatching
  5. Android 登录界面xml代码
  6. Android关于流媒体播放(1)
  7. VLC on Android
  8. android 程序调试入门
  9. android TabLayout Indicator 圆角
  10. android PopupWindow