本文介绍了键盘抬起时如何提升整个视图,需要更改哪些布局?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

显示键盘时,我在向上推整个回收者视图时遇到了麻烦,它切断了先前的消息.我正在创建一个看起来像以下xml的聊天视图:

I am having trouble pushing up the entire recycler view when the keyboard is diplayed, it cuts off the message that is previous. I am create a chat view that looks like this 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>

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

And this is my recycler view code:

 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);


        }


    }
}

所以当编辑文本框中选择在列表视图中不动了消息,但发送按钮,其余的事情 - 所以不知道我需要做的推升意见看法?看来我可能遇到了布局问题-但是尝试其他问题中的答案并没有为我解决:

So when the edit text box is selected the messages in the list view do not move up, but the SEND button and the rest do - so not sure what I need to do to push up the comments view? It looks like I might have a layout issue - but trying the answers in the other questions have not solved it for me:

解决方案1: 调整范围将视图推得过高,从而超过了状态栏中的电池和时间,并在键盘弹出时稍微切开了视图的底部.

Solution 1: The adjustpan pushes the view up too high going over the battery and time in the status bar and slightly cutting off the bottom of the view when the keyboard pops up.

解决方案2: Adjustresize不执行任何操作,视图仍然保持不变.

Solution 2: The adjustresize does nothing the view still stays the same.

推荐答案

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

If you want to resize your content when the softkeyboard opened, use adjust resize

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

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

or if you want your screen pushed to top, use adjustPan in your manifest

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

这篇关于键盘抬起时如何提升整个视图,需要更改哪些布局?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-23 03:33