'2018/09/19'에 해당되는 글 2건

728x90

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); // 어댑터를 리스트뷰에 세팅

    }
}
 


채팅 내용을 마지막으로 입력한 내용이 소트프키보드 입력창 위에 바로 보이도록 하는 코드다.

블로그 이미지

Link2Me

,
728x90
Android 채팅 라이브러리를 추가하면 에러가 발생한다.

implementation('com.github.nkzawa:socket.io-client:0.5.0') {
    exclude group: 'org.json', module: 'json'
}

원인을 알고보니 targetSdkVersion 26 에서는 com.github.nkzawa:socket.io-client:0.3.0 으로 하면 정상 동작한다.
com.github.nkzawa:socket.io-client:0.5.0 은 targetSdkVersion 27 에서 정상 동작하더라.

Creating a realtime chat app with android , NodeJs and Socket.io 에 대한 최신 예제는 https://dev.to/medaymentn/creating-a-realtime-chat-app-with-android--nodejs-and-socketio-4o55 를 참조하여 실행하면 Node.js 와 안드로이드간 통신이 간단하게 된다는 걸 확인할 수 있다.

회원정보와 연동하고, 내가 보낸 메시지, 상대방이 보낸 메시지를 구분하는 것은 안된다.

회원정보 연동은 Android-PHP-MySQL 통신으로 획득한 정보를 Node.js-Android 간에 활용하면 된다.
내가 보낸 메시지와 상대방이 보낸 메시지 구분은 RecyclerView 기능을 활용하면 해결 할 수 있다.


블로그 이미지

Link2Me

,