如何在键盘出现时推高整个视图,需要进行哪些布局更改?

时间:2016-10-07 05:17:23

标签: android android-recyclerview chat android-softkeyboard

当键盘显示时,我无法推升整个回收站视图,它会切断之前的消息。我创建了一个看起来像这个xml的聊天视图:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/commentsParentLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/noCommentsResults"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_above="@+id/lineSep"
        android:layout_alignParentTop="true"
        android:layout_marginTop="20dp"
        android:gravity="center"
        android:text="@string/noCommentsFound"
        android:textSize="20sp"
        android:visibility="gone" />

    <android.support.v4.widget.SwipeRefreshLayout
        android:id="@+id/pullToLoadMore"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_above="@+id/lineSep"
        android:layout_marginLeft="20dp"
        android:layout_marginRight="20dp"
        android:layout_marginTop="50dp"
        android:paddingBottom="10dp">

        <android.support.v7.widget.RecyclerView
            android:id="@+id/comments_recycler_view"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:scrollbars="none"
            />
    </android.support.v4.widget.SwipeRefreshLayout>

    <View
        android:id="@+id/lineSep"
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:layout_above="@+id/commentsAddLayout"
        android:background="@color/horizontalLine" />

    <LinearLayout
        android:id="@+id/commentsAddLayout"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_alignParentBottom="true"
        android:gravity="center"
        android:orientation="horizontal">

        <ImageView
            android:id="@+id/emojiSelector"
            android:layout_width="0dp"
            android:layout_height="36dp"
            android:layout_weight="1"
            android:src="@drawable/emoji" />

        <EditText
            android:id="@+id/commentText"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:layout_weight="4"
            android:background="@android:color/transparent"
            android:hint="@string/add_comment"
            android:maxLength="150" />

        <LinearLayout
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1">

            <View
                android:layout_width="1dp"
                android:layout_height="match_parent"
                android:background="@color/horizontalLine" />

            <TextView
                android:id="@+id/sendComment"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:gravity="center"
                android:text="@string/send"
                android:textSize="18sp" />
        </LinearLayout>
    </LinearLayout>
</RelativeLayout>

这是我的回收者视图代码:

 private void setupAdapter() {

        //stops lag for recycler view for load
        commentsRecyclerView.setHasFixedSize(true);
        commentsAdapter = new CommentsAdapter(this, dbCommentsList, TypeFaceProvider.getTypeFace(this, 0),
                TypeFaceProvider.getTypeFace(this, 1), TypeFaceProvider.getTypeFace(this, 2));
        LinearLayoutManager mLayoutManager = new LinearLayoutManager(this);
        mLayoutManager.setReverseLayout(true);
        mLayoutManager.setStackFromEnd(true);

        commentsRecyclerView.setLayoutManager(mLayoutManager);

        commentsRecyclerView.setItemAnimator(new DefaultItemAnimator());

        commentsAdapter.setOnEntryClickListener(new CommentsAdapter.OnEntryClickListener() {
            @Override
            public void onEntryClick(View view, int position) {
                DatabaseComment comment = dbCommentsList.get(position);
                TextView deleteBtn = (TextView) view.findViewById(R.id.commentUserRemove);
                if (view == deleteBtn) {

                    //used to remove the comment from db and the list
                    db.removeSingleComment(comment);
                    dbCommentsList.remove(position);
                    commentsAdapter.notifyDataSetChanged();

                } else {
                    takeToUserProfile(dbCommentsList.get(position));
                }
            }
        });

        commentsRecyclerView.setAdapter(commentsAdapter);
        commentsRecyclerView.scrollToPosition(0);

        hideProgressDialog();
    }

这是我的评论适配器:

public class CommentsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private static OnEntryClickListener mOnEntryClickListener;
    private List<DatabaseComment> dbCommentsList;
    private Typeface typeFace, italicTypeface, boldTypeface;

    public CommentsAdapter(Context mContext, List<DatabaseComment> comments, Typeface myTypeface, Typeface myTypefaceItalic, Typeface myTypefaceBold) {
        Context context = mContext;
        dbCommentsList = comments;
        typeFace = myTypeface;
        italicTypeface = myTypefaceItalic;
        boldTypeface = myTypefaceBold;
    }

    public void setOnEntryClickListener(OnEntryClickListener onEntryClickListener) {
        mOnEntryClickListener = onEntryClickListener;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        switch (viewType) {
            case 0:
                return new MyFeatureViewHolder(LayoutInflater.from(parent.getContext())
                        .inflate(R.layout.comment_business_item, parent, false));
            case 1:
                return new MyViewHolder(LayoutInflater.from(parent.getContext())
                        .inflate(R.layout.comment_user_item, parent, false));
        }

        return new MyViewHolder(LayoutInflater.from(parent.getContext())
                .inflate(R.layout.comment_user_item, parent, false));


    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {

        int pos = getItemViewType(position);

        //is a business comment
        if (pos == 0) {
            MyFeatureViewHolder featureViewHolder = (MyFeatureViewHolder) holder;

            DatabaseComment dbComment = dbCommentsList.get(position);

            featureViewHolder.commentCompany.setTypeface(boldTypeface);
            featureViewHolder.commentCompanyMsg.setTypeface(typeFace);
            featureViewHolder.commentCompanyDate.setTypeface(italicTypeface);

            featureViewHolder.commentCompany.setText(dbComment.getUsername());
            featureViewHolder.commentCompanyMsg.setText(dbComment.getCommentText());

            Calendar date = Calendar.getInstance();
            date.setTimeInMillis(dbComment.getCommentDate());
            int newMonth = date.get(Calendar.MONTH) + 1;
            String commentDateTxt = (newMonth + "." + date.get(Calendar.DAY_OF_MONTH) + "." + date.get(Calendar.YEAR));

            featureViewHolder.commentCompanyDate.setText(commentDateTxt);


        }



        //anything greater than 0 is a user comment - with emoji
        if (pos == 1) {
            MyViewHolder myViewHolder = (MyViewHolder) holder;

            if (dbCommentsList.get(position).getIsChanged() == 1) {
                myViewHolder.commentUserRemove.setVisibility(View.VISIBLE);
            } else {
                myViewHolder.commentUserRemove.setVisibility(View.GONE);
            }

            DatabaseComment dbComment = dbCommentsList.get(position);

            myViewHolder.commentUsername.setTypeface(boldTypeface);
            myViewHolder.commentUserMsg.setTypeface(typeFace);
            myViewHolder.commentUserDate.setTypeface(italicTypeface);

            myViewHolder.commentUsername.setText(dbComment.getUsername());
            myViewHolder.commentUserMsg.setText(dbComment.getCommentText());

            Calendar date = Calendar.getInstance();
            date.setTimeInMillis(dbComment.getCommentDate());

            //Note only one plus one because of new comments added will
            int newMonth = date.get(Calendar.MONTH) + 1;
            String commentDateTxt = (newMonth + "." + date.get(Calendar.DAY_OF_MONTH) + "." + date.get(Calendar.YEAR));

            myViewHolder.commentUserDate.setText(commentDateTxt);

            int[] commentsImageList = new int[]{R.drawable.e1, R.drawable.e1, R.drawable.e2, R.drawable.e3, R.drawable.e4,
                    R.drawable.e5, R.drawable.e6, R.drawable.e7, R.drawable.e8, R.drawable.e9, R.drawable.e10,
                    R.drawable.e11, R.drawable.e12, R.drawable.e13, R.drawable.e14,
                    R.drawable.e15, R.drawable.e16, R.drawable.e17, R.drawable.e18, R.drawable.e19};
            myViewHolder.emojiIcon.setImageResource(commentsImageList[dbComment.getIsType()]);


        }


    }

    @Override
    public int getItemCount() {
        return dbCommentsList.size();
    }

    @Override
    public int getItemViewType(int position) {
        if (dbCommentsList.get(position).getIsType() == 0) {
            return 0;
        } else {
            return 1;
        }
    }


    public interface OnEntryClickListener {
        void onEntryClick(View view, int position);
    }

    public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        public TextView commentUsername, commentUserMsg, commentUserDate, commentUserRemove;
        public ImageView emojiIcon;


        public MyViewHolder(View view) {
            super(view);
            commentUsername = (TextView) view.findViewById(R.id.commentUsername);
            commentUserMsg = (TextView) view.findViewById(R.id.commentUserMsg);
            commentUserDate = (TextView) view.findViewById(R.id.commentUserDate);
            commentUserRemove = (TextView) view.findViewById(R.id.commentUserRemove);
            emojiIcon = (ImageView) view.findViewById(R.id.emojiIcon);

            view.setOnClickListener(this);
            commentUserRemove.setOnClickListener(this);

        }

        @Override
        public void onClick(View v) {
            if (mOnEntryClickListener != null) {
                mOnEntryClickListener.onEntryClick(v, getAdapterPosition());

            }
        }
    }

    public class MyFeatureViewHolder extends RecyclerView.ViewHolder {
        public TextView commentCompany, commentCompanyMsg, commentCompanyDate;
        public ImageView emojiIcon;


        public MyFeatureViewHolder(View view) {
            super(view);
            commentCompany = (TextView) view.findViewById(R.id.commentCompany);
            commentCompanyMsg = (TextView) view.findViewById(R.id.commentCompanyMsg);
            commentCompanyDate = (TextView) view.findViewById(R.id.commentCompanyDate);
            emojiIcon = (ImageView) view.findViewById(R.id.emojiIcon);


        }


    }
}

因此,当选择编辑文本框时,列表视图中的消息不会向上移动,而是SEND按钮和其他消息 - 所以不确定我需要做什么来推高评论视图?看起来我可能有布局问题 - 但尝试其他问题的答案并没有解决它:

解决方案1:  当键盘弹出时,调整盘将视图向上推过电池和时间在状态栏中并略微切断视图底部。

解决方案2:  adjustresize看不到视图仍然保持不变。

1 个答案:

答案 0 :(得分:3)

如果要在打开软键盘时调整内容大小,请使用adjust resize

<application ... >
    <activity
        android:windowSoftInputMode="adjustResize" ... >
        ...
    </activity>
    ...
</application>

或者如果您希望将屏幕推到顶部,请在清单中使用adjustPan

<application ... >
    <activity
        android:windowSoftInputMode="adjustPan" ... >
        ...
    </activity>
    ...
</application>