지금 하던 모든 작업을 어느정도 일단락 시키고, 유튜브 스타일의 UI 를 만들기 위해 본격적으로 코딩을 시작하였다. 예전에 팀장님께서 공유해 주신 링크를 바탕으로 가볍게 만들어 보려고 시작!



링크 : https://github.com/pedrovgs/DraggablePanel



이미 누군가 만들어놓은 오픈 소스 라이브러리를 샘플로 돌려보고, 오! 이거 사용하면 되겠다 생각하고 신나게

코딩을 시작!

그런데... 예상밖의 문제가 발생했다.



실행하자 마자, 에러 뿜뿜!!


이렇게 하면 된다매...

뭐가 문제일까를 놓고 약 3시간 가량 '삽질' 을 했다...

결국 해결 못하고, 지금 블로그 포스팅 중 ㅋㅋㅋ


안타까운 건, 해당 코드는 2014년 도에 유지보수가 멈춰진 상태였다.






다시 괜찮은 라이브러리가 있는지 검색중... 후 없다...


에러 뿜뿜인 라이브러리를 다시 커스터마이징 해서 만드느냐, 괜찮은 라이브러리를 새로 찾느냐.

둘중 하나는 해야할 것 같다...




'개발이야기 > 성장일기' 카테고리의 다른 글

Youtube style UI 적용기 -02  (0) 2018.03.14
Posted by 자바리즘
,

7.0


앱 테마를 FullScreen 으로 설정 하고, Manifest 에서 adjustResize 를 설정하면 스크롤이 되지 않는

문제가 발생하였다.


그럴때는 코드 단에서 아래 코드를 기입하면 해결 할 수 있다.


protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,                                                                                  WindowManager.LayoutParams.FLAG_FULLSCREEN);

        getWindow().clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN);

        setContentView(R.layout.main_layout);

}


setContentView 를 하기 전에 위 코드를 삽입하여 해결하자!!

4.x 와 7.x 에서는 정상 동작 하였다. (5.x 는 확인하지 못함. 디바이스가 없음. 좀 사주라)



그러나!! 두둥!!

6.x 마쉬멜로우 버전에서는 위 코드 가지고는 해결이 되지 않았다.

6.0 대의 버그라고나 할까?

아래 코드로 해결하자!



private FrameLayout.LayoutParams mFrameLayoutParams;

private View mChildView;

private int usableHeightPrevious;


    protected void onCreate(Bundle savedInstanceState) {

FrameLayout frameLayout = (FrameLayout)findViewById(R.id.frameLayout);

        mChildView = frameLayout.getChildAt(0);

        mChildView.getViewTreeObserver().addOnGlobalLayoutListener(new                                                                             ViewTreeObserver.OnGlobalLayoutListener() {

            @Override

            public void onGlobalLayout() {

                resizeContent();

            }

        });


        mFrameLayoutParams = (FrameLayout.LayoutParams)mChildView.getLayoutParams();

    }


    private void resizeContent() {

        int usableHeightNow = computeUsableHeight();

        if (usableHeightNow != usableHeightPrevious) {

            int usableHeightSansKeyboard = mChildView.getRootView().getHeight();

            int heightDifference = usableHeightSansKeyboard - usableHeightNow;

            if (heightDifference > (usableHeightSansKeyboard/4)) {

                // keyboard probably just became visible

                mFrameLayoutParams.height = usableHeightSansKeyboard - heightDifference;

            } else {

                // keyboard probably just became hidden

                mFrameLayoutParams.height = usableHeightSansKeyboard;

            }


            mChildView.requestLayout();


            usableHeightPrevious = usableHeightNow;

        }

    }


    private int computeUsableHeight() {

        Rect r = new Rect();

        mChildView.getWindowVisibleDisplayFrame(r);

        return (r.bottom - r.top);

    }



'안드로이드 > TIP' 카테고리의 다른 글

Gradle Permission denied  (0) 2018.04.12
Aapt2Exception -part 2  (0) 2018.03.20
안드로이드 7.0 동작 변경 사항  (0) 2017.11.28
Multidex, ClassNotFoundException  (0) 2017.11.27
Aapt2Exception  (0) 2017.11.27
Posted by 자바리즘
,

Mac , Android Studio 환경에서 터미널로 앱 빌드를 하고 싶으면


./gradlew build



위와 같은 명령어로 빌드를 실행할 수 있다.



bash: ./gradlew: Permission denied


그러나 위와 같이 Permission denied 가 발생하면



chmod +x gradlew  를 터미널에 입력 한 후, 다시 ./gradlew build 를 실행하면 빌드가 되는 것을 확인 할 수 있다.



Posted by 자바리즘
,

안드로이드 SDK 버전을 23으로 올리면 다양한 이슈들이 나온다.

보안 때문에 23으로 올리고 '권한' 획득해서 테스트 하고,

잘되는 것 확인!


룰루랄라~


그런데 이게 왠일!


LG 스마트폰에서 외부 라이브러리를 호출하면 앱이 '강제종료' 되는 것이었다!!


문서를 읽어보니, SDK 23 에서는 경고만 뱉는다고 되있는데, LG 단말은 예외였다.

(삼성 단말은 됨...)


라이브러리를 직접 빌드 할 수 있다면 구글 개발자 사이트에 권고(?) 된 내용대로 코드 수정하고, 재 배포해서 사용하면 될 것 같지만 직접 빌드를 할 수 없었기에...

결국은 다른 라이브러리로 교체 했다 ㅠㅠ




혹시, 외부 라이브러리를 사용하는데 앱이 강제 종료 된다면 아래 출처에서 내용 확인 후,

적용해 보시기를.


라이브러리 

대상 API 

동적링커를 통한 런타임 엑세스 

N Developer

Preview 동작 

최종 N 릴리스

동작 

미래의 Android

플랫폼 동작 

 NDK 공개

 모두

 엑세스 가능

 예상대로 작동

 예상대로 작동

 예상대로 작동

 비공개 (임시로 엑세스 가능한 비공개 라이브러리)

 23 이하

 임시로

 엑세스 가능

 예상대로 작동하지만 대상 기기에서 logcat 경고 및 메시지를 수신

 예상대로 작동하지만 logcat 경고 수신

 런타임 오류

 비공개 (임시로 엑세스 가능한 비공개 라이브러리)

 24 이상

 제한됨

런타임오류 

 런타임오류

 런타임오류

 비공개(기타)

 모두

 제한됨

 런타임오류

 런타임오류

 런타임오류



출처 : https://developer.android.com/about/versions/nougat/android-7.0-changes.html?hl=ko

'안드로이드 > TIP' 카테고리의 다른 글

Aapt2Exception -part 2  (0) 2018.03.20
키보드 올라왔을 때 화면 스크롤  (0) 2018.02.28
Multidex, ClassNotFoundException  (0) 2017.11.27
Aapt2Exception  (0) 2017.11.27
Memory leak 을 유발하는 Handler 의 사용  (0) 2017.11.07
Posted by 자바리즘
,

SDK 버전을 23으로 올리고 난 후, 안드로이드 4.4 버전(KITKAT) 에서 FacebookSDK 를 init

하지 못하는 문제가 발생 하였다.


FaceBook sdk 를 호출하는 과정에서 ClassNotFoundException 이 발생!!


뭐지? 뭐지?!


검색하면 build.gradle 에서 multidex 를 enable 하라는 것 밖에는 나오지 않고...


    defaultConfig {        

        multiDexEnabled true        

    }


위 코드 삽입 > 실패



    dexOptions {

        javaMaxHeapSize "4g"

        preDexLibraries = false

    }


덱스옵션!! > 실패




수많은 검색을 통해 알아냈다.



Application 을 상속받는 클래스를 만들어서 Manifest 에 연결해주고,

이 클래스에서 attachBaseContext 를 오버라이드 하고


@Override

protected void attachBaseContext(Context base) {

super.attachBaseContext(base);

MultiDex.install(this);

}


MultiDex.install 함수를 호출하니, 해결 되었다. 후...

Posted by 자바리즘
,

Aapt2Exception

안드로이드/TIP 2017. 11. 27. 17:37

어느날 빌드를 하려고 보니, Aapt2Exception 라는 에러를 뱉으며 빌드실패가 되었다.





여러 삽질 끝에, 결국은 내가 작성한 AndroidManifest.xml 파일이 잘못되었음을 알게 되었다.



    <activity android:name=".MainActivity">      

      

                <data android:scheme="@string/kakao_scheme"

                    android:host="@string/kakaolink_host" />       

     

    </activity>



위와 같이 작성하는 초보적인 실수를 한 것 이다.




    <activity android:name=".MainActivity">

            <intent-filter>

                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.DEFAULT" />

                <category android:name="android.intent.category.BROWSABLE" />


                <data android:scheme="@string/kakao_scheme"

                    android:host="@string/kakaolink_host" />

            </intent-filter>


    </activity>



위와 같이 intent-filter 안에 data 태그를 작성해야 오류가 나지 않는다.



Posted by 자바리즘
,

안드로이드에서 Handler 클래스는 유용한 클래스이다.

메시지 방식으로 사용하는 이 클래스는 메시지를 보내고, 받는 곳에서는 기능을 구현하면 된다.


그러나, 우리는 이너 클래스(inner class) 방식으로 종종 사용하곤 한다.


Handler handler = new Handler() {

        @Override

        public void handleMessage(Message msg) {

      //TODO


  }

}



위의 방식이 간편하지만, 메모리 누수를 가져올 수 있다고 한다.



handler 를 static final 로 선언하고 WeakReference 를 참조하여 Activity 의 변수들을 참조하여 사용하면 좋을 것 같다.



public class MyActivity extends Activity {


private MyHandler mHandler = new MyHandler(this);


private String mText;



@Override

      protected void onCreate(Bundle savedInstanceState) {

mText = "Example";

}



private static final class MyHandler extedns Handler {


private final WeakReference<MyActivity> ref;    //Weak 레퍼런스 선언


public MyHandler (MyActivity act) {

ref = new WeakReference<>(act);    //Weak 레퍼런스 생성

}


@Override

            public void handleMessage(Message msg) {

             MyActivity act = ref.get();


 if( act != null ) {

//TODO

//act 를 통해서, act 의 변수들을 참조 할 수 있다.

if(act.mText.isEmpty() ) {


}

 }

      }

}

}




출처 : https://medium.com/@joongwon/android-memory-leak-%EC%82%AC%EB%A1%80-6565b817a8fe

'안드로이드 > TIP' 카테고리의 다른 글

Multidex, ClassNotFoundException  (0) 2017.11.27
Aapt2Exception  (0) 2017.11.27
가로 세로 전환 시, 액티비티 재 생성되는 문제  (0) 2017.10.26
HttpUrlConnection 세션  (0) 2017.10.18
단순히 특정앱만 호출하자!  (0) 2017.09.27
Posted by 자바리즘
,