2016-10-07 9 views
2

У меня возникли проблемы с нажатием на весь вид ресайклера, когда клавиатура перевернута, она отключает предыдущее сообщение. Я создать представление чат, который выглядит как этот 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: Регулировка не делает ничего, вид все еще остается неизменным.

+0

последнего макет должен правильно выровняйтесь по нижней части. Для этого. – Nepster

+0

Можете ли вы подробно остановиться на этом, что мне нужно добавить, спасибо! – Lion789

+0

Часть, которую вы хотите оттолкнуть снизу, должна быть выровнена снизу должным образом, иначе половина ее разреза или не нажимает – Nepster

ответ

2

Если вы хотите изменить свое содержание, когда softkeyboard открыт, использование регулировку размера

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

или если вы хотите, чтобы ваш экран толкнул сверху, используйте adjustPan в своем манифесте

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

Первый не влияет на нее вообще, такая же ситуация , а второй работает несколько, но отсекает часть нижней части чата, а также, статистика бара батареи и времени накладывает верхние комментарии? – Lion789

+0

@ Lion789 вам нужно обернуть весь контент прокручиваемым, как NestedScrollView. В противном случае adjustResize не будет работать. И да, AdjustPan работает только так. –

+0

Прокрутка должна быть родительской или обернуть весь контент в моей линейной компоновке? Я завернул все с просмотром прокрутки - и теперь мой SEND и нижняя панель переместились на самый верх при запуске, и клавиатура сразу же исчезла ... – Lion789

 Смежные вопросы

  • Нет связанных вопросов^_^