Android 채팅창 구현을 해보려고 시도하면서 SoftKeyboard 가 활성화되면 Recyclerview 입력한 내용이 자동으로 스크롤 되는 기능이 제공되어야 할 거 같아서 EditText 터치이벤트 등으로 시도를 해보왔으나 실패!!!
http://givenjazz.tistory.com/54 에 나온 코드가 내가 원하는 코드였다.
이 코드 덕분에 코드가 좀 더 정교해지고 있는거 같다.
import android.app.Activity; import android.content.Context; import android.graphics.Rect; import android.util.AttributeSet; import android.view.View;
public class SoftKeyboardDectectorView extends View { // 출처 : http://givenjazz.tistory.com/54 private boolean mShownKeyboard; private OnShownKeyboardListener mOnShownSoftKeyboard; private OnHiddenKeyboardListener onHiddenSoftKeyboard;
public SoftKeyboardDectectorView(Context context) { this(context, null); }
public SoftKeyboardDectectorView(Context context, AttributeSet attrs) { super(context, attrs); }
@Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { Activity activity = (Activity)getContext(); Rect rect = new Rect(); activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(rect); int statusBarHeight = rect.top; int screenHeight = activity.getWindowManager().getDefaultDisplay().getHeight(); int diffHeight = (screenHeight - statusBarHeight) - h; if (diffHeight > 100 && !mShownKeyboard) { // 모든 키보드는 100px보다 크다고 가정 mShownKeyboard = true; onShownSoftKeyboard(); } else if (diffHeight < 100 && mShownKeyboard) { mShownKeyboard = false; onHiddenSoftKeyboard(); } super.onSizeChanged(w, h, oldw, oldh); }
public void onHiddenSoftKeyboard() { if (onHiddenSoftKeyboard != null) onHiddenSoftKeyboard.onHiddenSoftKeyboard(); }
public void onShownSoftKeyboard() { if (mOnShownSoftKeyboard != null) mOnShownSoftKeyboard.onShowSoftKeyboard(); }
public void setOnShownKeyboard(OnShownKeyboardListener listener) { mOnShownSoftKeyboard = listener; }
public void setOnHiddenKeyboard(OnHiddenKeyboardListener listener) { onHiddenSoftKeyboard = listener; }
public interface OnShownKeyboardListener { public void onShowSoftKeyboard(); }
public interface OnHiddenKeyboardListener { public void onHiddenSoftKeyboard(); } } |
사용법
public class ChatBoxActivity extends AppCompatActivity { Context context;
public RecyclerView listView; public ArrayList<Chat_Item> chatItemList = new ArrayList<>(); ; RecyclerView.Adapter listViewAdapter; RecyclerView.LayoutManager layoutManager;
public EditText editText; public Button send ; //declare socket object private Socket socket; public String Nickname;
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_chat_box); context = this.getBaseContext();
editText = (EditText) findViewById(R.id.message) ; send = (Button)findViewById(R.id.send); // get the nickame of the user SharedPreferences pref = getSharedPreferences("pref", Activity.MODE_PRIVATE); String userNM = pref.getString("userNM", ""); String userID = pref.getString("userID", ""); Nickname = userNM +"("+userID+")";
final SoftKeyboardDectectorView softKeyboardDecector = new SoftKeyboardDectectorView(this); addContentView(softKeyboardDecector, new FrameLayout.LayoutParams(-1, -1));
softKeyboardDecector.setOnShownKeyboard(new SoftKeyboardDectectorView.OnShownKeyboardListener() { @Override public void onShowSoftKeyboard() { //키보드 등장할 때 채팅창 마지막 입력 내용을 바로 보이도록 처리 listView.scrollToPosition(chatItemList.size()-1); } });
try { socket = IO.socket(Value.ChatLive); // 채팅서버 주소 socket.connect(); socket.emit("join", Nickname); } catch (URISyntaxException e) { e.printStackTrace(); }
// Adapter에 추가 데이터를 저장하기 위한 ArrayList listView = (RecyclerView) findViewById(R.id.messagelist); RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getApplicationContext()); listView.setLayoutManager(layoutManager); listView.setItemAnimator(new DefaultItemAnimator());
listViewAdapter = new ListViewAdapter(chatItemList, this); // Adapter 생성 listView.setAdapter(listViewAdapter); // 어댑터를 리스트뷰에 세팅
} } |
채팅 내용을 마지막으로 입력한 내용이 소트프키보드 입력창 위에 바로 보이도록 하는 코드다.