728x90

 

하단에 고정위치하게 두니, EditText 등을 배치했을 때 버튼이 가려져서 성가셨습니다.

이처럼 불편할 때, 드래그로 움직일 수 있는 FloatingActionButton라면 문제가 없겠죠.

 

package com.example;

import android.content.Context;
import android.support.design.widget.FloatingActionButton;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;

public class MovableFloatingActionButton extends FloatingActionButton implements View.OnTouchListener {

    private final static float CLICK_DRAG_TOLERANCE = 10; // Often, there will be a slight, unintentional, drag when the user taps the FAB, so we need to account for this.

    private float downRawX, downRawY;
    private float dX, dY;

    public MovableFloatingActionButton(Context context) {
        super(context);
        init();
    }

    public MovableFloatingActionButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public MovableFloatingActionButton(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        setOnTouchListener(this);
    }

    @Override
    public boolean onTouch(View view, MotionEvent motionEvent){

        ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams)view.getLayoutParams();

        int action = motionEvent.getAction();
        if (action == MotionEvent.ACTION_DOWN) {

            downRawX = motionEvent.getRawX();
            downRawY = motionEvent.getRawY();
            dX = view.getX() - downRawX;
            dY = view.getY() - downRawY;

            return true; // Consumed

        }
        else if (action == MotionEvent.ACTION_MOVE) {

            int viewWidth = view.getWidth();
            int viewHeight = view.getHeight();

            View viewParent = (View)view.getParent();
            int parentWidth = viewParent.getWidth();
            int parentHeight = viewParent.getHeight();

            float newX = motionEvent.getRawX() + dX;
            newX = Math.max(layoutParams.leftMargin, newX); // Don't allow the FAB past the left hand side of the parent
            newX = Math.min(parentWidth - viewWidth - layoutParams.rightMargin, newX); // Don't allow the FAB past the right hand side of the parent

            float newY = motionEvent.getRawY() + dY;
            newY = Math.max(layoutParams.topMargin, newY); // Don't allow the FAB past the top of the parent
            newY = Math.min(parentHeight - viewHeight - layoutParams.bottomMargin, newY); // Don't allow the FAB past the bottom of the parent

            view.animate()
                    .x(newX)
                    .y(newY)
                    .setDuration(0)
                    .start();

            return true; // Consumed

        }
        else if (action == MotionEvent.ACTION_UP) {

            float upRawX = motionEvent.getRawX();
            float upRawY = motionEvent.getRawY();

            float upDX = upRawX - downRawX;
            float upDY = upRawY - downRawY;

            if (Math.abs(upDX) < CLICK_DRAG_TOLERANCE && Math.abs(upDY) < CLICK_DRAG_TOLERANCE) { // A click
                return performClick();
            }
            else { // A drag
                return true; // Consumed
            }

        }
        else {
            return super.onTouchEvent(motionEvent);
        }

    }

}

 

XML에서는 다음과 같습니다.

 

    <com.example.MovableFloatingActionButton
        android:id="@+id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|end"
        android:layout_margin="@dimen/fab_margin"
        android:src="@drawable/ic_navigate_next_white_24dp"/>

 

Reference

https://stackoverflow.com/questions/46370836/android-movable-draggable-floating-action-button-fab

728x90
728x90

 

//EditText 객체에서 onKeyPreIme 메소드를 재정의

    public boolean onKeyPreIme( int keyCode, KeyEvent event ) {
     
   
     Log.d("AutoCallService", "keyCode : "+keyCode+"");
     Log.d("AutoCallService", "event.getKeyCode() : "+event.getKeyCode()+"");
     switch (event.getAction()) {
     
     case KeyEvent.ACTION_DOWN :
     
     if( event.getAction() == KeyEvent.ACTION_DOWN ) {
     if( keyCode == KeyEvent.KEYCODE_BACK ) {
     this.clearFocus();
     

     Log.d("AutoCallService", "onBackPressed()2");
     }
     }
     break;
     
     
     }
   
return super.onKeyPreIme( keyCode, event );
}

Activity 에서 implements OnEditorActionListener 후


/*@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {

if(event.getAction() == KeyEvent.ACTION_DOWN)
{
Log.i("AutoCallService", event.getKeyCode()+"");

}
// TODO Auto-generated method stub
return false;
}*/

 

Reference

http://nerobong2.blogspot.com/2015/12/androidedittext.html

728x90
728x90

 

1. Apk를 디컴파일하는 방법 소개

(1) 단계벌 디컴파일

  • Apktool: apk의 리소스를 변환하는데 사용됩니다.
  • dex2jar: dex를 jar로 변환하는데 사용됩니다.
  • jd-cmd: jar를 java 코드로 변환하는데 사용됩니다.

(2) 명령어 한번에 apk를 쉽게 디컴파일해주는 툴 존재

  • jadx : Apk를 decompile하며, GUI와 Command line 툴 모두 제공합니다

 

2. Jadx로 디컴파일하는 방법

Jadx는 Jadx-release에서 빌드된 파일을 다운받을 수 있음

Jadx는 command line과 GUI tool을 모두 제공.

1) tool zip 파일을 다운받고 압축을 품

2) bin 폴더를 보면 실행 파일이 존재

- jadx는 command line tool이고, jadx-gui는 GUI tool

(Linux 사용자는 양쪽 다 사용 가능, Windows 사용자의 경우 jadx-gui.bat을 사용해야 함)

 

 

 

* command line tool의 상세 사용방법은 아래 참조글을 확인하면 됨

 

 

Reference

https://codechacha.com/ko/how-to-decompile-android-apk/

 

 

 

728x90
728x90

1. 블루투스 장치목록 가져오기, 장치 연결/해제 이벤트 받기

https://blog.naver.com/awesomedev/220679754787

 

2. Android — BLE 통신 예제(1)

 

https://medium.com/@lyoungh2570/android-ble-%ED%86%B5%EC%8B%A0-%EC%98%88%EC%A0%9C-%EB%B6%84%EC%84%9D-8d01507a1177

728x90

+ Recent posts