2014-03-19 38 views
5

我正在工作的應用程序的功能是人們可以與海誓山盟聊天。在ChatFragment中。我想有相同的功能WhatsApp的和電報,您可以點擊表情按鈕和鍵盤切換到Emojipicker 沒有其中emoticonpicker具有相同的佈局的高度,我的鍵盤(就像WhatsApp的和電報)任何過渡。如何在Android中處理Emojipicker和鍵盤之間的切換?

當我實現它,並從softwarekeyboard切換到表情符號鍵盤我softwarekeyboard將dissapear和去可見我emojipicker的可見性將被設置。除了由於佈局變化而導致的醜陋的錯誤過渡之外,所有設備的尺寸也相同,因此不必牢記鍵盤具有不同的高度。我正在使用以下emojipicker https://github.com/rockerhieu/emojicon

任何人都知道如何更改我的實現,以便我的emojipicker與我的鍵盤具有相同的高度?我嘗試了各種各樣的東西,但沒有一個工作..在我的chatfragment和layout下面的一些代碼。

ChatFragment

public class ChatFragment extends W3SFragment implements IResultListener { 

    private int chatContactId; 
    private Context context; 
    private DatabaseHelper databaseHelper; 
    private InputMethodManager inputManager; 

    private View fragmentView; 
    private TextView statusText; 

    private ImageView emojiconIconImageView; 
    private View emojiconViewContainer; 

    private ChatContact chatContact; 

    public EmojiconEditText emojiconEditText; 


    public ChatFragment(int chatContactId) { 

     this.chatContactId = chatContactId; 
     databaseHelper = new DatabaseHelper(); 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     this.context = getActivity(); 
     getSherlockActivity().getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); 

     inputManager = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); 
     getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING); 

    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     fragmentView = inflater.inflate(R.layout.chat_main, null); 
     FragmentManager fm = getChildFragmentManager(); 
     FragmentTransaction ft = fm.beginTransaction(); 

     Fragment emojiconsFragment = new EmojiconsFragment(); 
     ft.replace(R.id.emojiconsContainer, emojiconsFragment); 
     ft.commit(); 

     return fragmentView; 
    } 



    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 

     statusText = (TextView) fragmentView.findViewById(R.id.ChatStatusText); 

     emojiconEditText = (EmojiconEditText) fragmentView.findViewById(R.id.editMessage); 
     emojiconEditText.requestFocus(); 

     emojiconIconImageView = (ImageView) fragmentView.findViewById(R.id.chatSmileyIcon); 
     emojiconIconImageView.setOnClickListener(new OnEmojiconIconClickListener()); 


     emojiconViewContainer = fragmentView.findViewById(R.id.emojiconsContainer); 
     emojiconViewContainer.setVisibility(View.GONE); 

     setkeyboardLayoutListeners(); 
     setContactLayout(); 
    } 

    public void setContactLayout() { 
     ChatContact chatContact = databaseHelper.getContact(chatContactId); 
     if(chatContact != null) { 

      setStatusMessage(chatContact.Status); 
      getSherlockActivity().setTitle(chatContact.Name); 
      if(chatContact.Picture != null) { 
       Bitmap l_bTmp = CommonUtilities.getSquareImage(CommonUtilities.createBitmapFromImageLocation(mStrBasePath + chatContact.Picture)); 
       Bitmap l_bmpOverlay = BitmapFactory.decodeResource(context.getResources(), R.drawable.image_round_overlay_darkgrey); 

       getSherlockActivity().getSupportActionBar().setIcon(CommonUtilities.createDrawableFromBitmap(getSherlockActivity().getApplicationContext(), CommonUtilities.overlay(l_bTmp, l_bmpOverlay))); 
      } 
     } 
    } 

    public void setStatusMessage(String message) { 
     if(message != null && message.equals("")) 
      message = getResources().getString(R.string.chat_status_default); 

     statusText.setText(message); 
    } 

    @Override 
    public void onResultSucceeded(String p_strResult) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onProgress(Integer p_IntProgress) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void GotInternetBack() { 
     // TODO Auto-generated method stub 

    } 

    public static void onAttachmentclick(MainActivity mainActivity) { 
     // TODO Auto-generated method stub 

    } 

    private void changeKeyboardLayout(boolean showEmoticons) { 
     if(showEmoticons) { 
      inputManager.hideSoftInputFromWindow(emojiconEditText.getWindowToken(), 0); 
      emojiconViewContainer.setVisibility(View.VISIBLE); 
      emojiconIconImageView.setImageResource(R.drawable.ic_action_keyboard); 
     } else { 
      inputManager.showSoftInput(emojiconEditText, 0); 
      emojiconViewContainer.setVisibility(View.INVISIBLE); 
      emojiconIconImageView.setImageResource(R.drawable.smiley_icon); 
     } 
    } 

    private void setkeyboardLayoutListeners() { 
     emojiconEditText.setOnTouchListener(new OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       changeKeyboardLayout(false); 
       return false; 
      } 
     }); 
     emojiconEditText.setKeyImeChangeListener(new KeyImeChange() { 

      @Override 
      public void onKeyIme(int keyCode, KeyEvent keyEvent) { 
       if(keyEvent.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK) { 
        closeKeyboardLayout(); 
       } 
      } 
     }); 
    } 


    private void closeKeyboardLayout() 
    { 
     inputManager.hideSoftInputFromWindow(emojiconEditText.getWindowToken(), 0); 
     emojiconViewContainer.setVisibility(View.GONE); 
     emojiconIconImageView.setImageResource(R.drawable.smiley_icon); 
    } 

    private class OnEmojiconIconClickListener implements OnClickListener { 

     @Override 
     public void onClick(View arg0) { 
      if(emojiconViewContainer.getVisibility() == View.VISIBLE) { 
       changeKeyboardLayout(false); 
      } else { 
       changeKeyboardLayout(true); 
      } 
     } 
    } 
} 

chat_main.xml

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

    <LinearLayout 
     android:id="@+id/statusHold" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal" 
     android:background="@color/lightgrey" 
     android:gravity="center" > 

     <TextView 
      android:id="@+id/ChatStatusText" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:gravity="left" 
      android:text="@string/chat_status_default" 
      android:textStyle="italic" 
      android:textColor="#777777" 
      android:maxLines="1" 
      android:ellipsize="end" 
      android:padding="10dp" /> 
    </LinearLayout> 

    <ListView 
     android:id="@+id/Messages" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_below="@+id/statusHold" 
     android:layout_above="@+id/writerLayout" /> 

    <LinearLayout 
     android:id="@+id/writerLayout" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:orientation="vertical" > 

     <LinearLayout 
      android:id="@+id/chatSentMessageHolder" 
      android:layout_width="match_parent" 
      android:layout_height="50dp" 
      android:background="@drawable/border_grey" 
      android:orientation="horizontal" 
      android:padding="5dp" > 

      <ImageView 
       android:id="@+id/chatSmileyIcon" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_gravity="center" 
       android:src="@drawable/smiley_icon" /> 

      <com.rockerhieu.emojicon.EmojiconEditText 
       android:id="@+id/editMessage" 
       android:layout_width="0dip" 
       android:layout_height="match_parent" 
       android:layout_marginLeft="5dp" 
       android:layout_marginRight="10dp" 
       android:layout_marginTop="1dp" 
       android:layout_weight="0.1" 
       android:background="@drawable/et_selector" 
       emojicon:emojiconSize="28sp" 
       android:ems="10" 
       android:hint="@string/chat_default_message_sent_text" 
       android:inputType="text"/> 

      <ImageView 
       android:id="@+id/chatSentMessageIcon" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_gravity="center" 
       android:background="@drawable/chat_sent_icon" /> 
     </LinearLayout> 

     <!-- Layout to inflate the emojicons in --> 
     <LinearLayout 
      android:id="@+id/emojiconsContainer" 
      android:layout_width="match_parent" 
      android:layout_height="220dp" 
      android:orientation="vertical"/> 
    </LinearLayout> 
</RelativeLayout> 

在ChatFragment我設置SoftInputMode到SOFT_INPUT_ADJUST_NOTHING因爲我tryed加載我softwarekeyboard背後的emotoji鍵盤,其工作非常非常好。我再次遇到的唯一問題是emojipicker的高度。當我測試了我的Galaxy S3的大小是一樣的鍵盤,我的Nexus 5和GalaxyŸDUO佈局有點大縮小,然後在鍵盤佈局,使無形的emojipicker貼出來的軟件鍵盤的.. 。

有沒有人對我怎樣才能成功地實現這個沒有得到怪異的佈局毛刺或動畫任何提示?

+0

嘿。你有沒有用這個解決方案寫博客?我對它很感興趣。謝謝。 – Stanete

+0

是的,我希望看到你的解決方案。 – Dave

+0

在哪裏博客文章 –

回答

0

感興趣的人 - 你可以看看這裏https://github.com/DrKLO/Telegram/blob/master/TMessagesProj/src/main/java/org/telegram/ui/Views/ChatActivityEnterView.java

電報的源代碼基本上這android.widget.PopupWindow

+0

德米特里...它的一個斷開的鏈接! – Ramesh

+0

@Ramesh使用武力和滾動歷史回到10月14日https://github.com/DrKLO/Telegram/blob/4ddfda63403e69c3c35f8c7f6bef850533af8599/TMessagesProj/src/main/java/org/telegram/ui/Views/ChatActivityEnterView.java –

相關問題