728x90

FragmentStatePagerAdapter는 API 27에서 deprecated 되었다.

그렇다면 개선하기 위해서는 어떻게 해야할까?

 

android.support.v13.app.FragmentPagerAdapter was deprecated.

따라서 android.support.v4.app.FragmentPagerAdapter를 쓰자.

 

AndroidX로 따지면,

androidx.fragment.app.FragmentStatePagerAdapter 대신에

androidx.fragment.app.FragmentPagerAdapter 를 쓰는 것.

 

 

만약, 기존소스가 아래와 같다면,

private class MainPagerAdapter extends FragmentStatePagerAdapter {

        MainPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            Fragment result = new DummyFragment();
             return result;
        }

        @Override
        public int getCount() {
            return 5;
        }

    }

 

Pager class는 아래와 같이 변경하고,

private class MainPagerAdapter extends FragmentPagerAdapter {

        MainPagerAdapter(@NonNull FragmentManager fm, int behavior) {
            super(fm, behavior);
        }

        @Override
        public Fragment getItem(int position) {
            Fragment result = new DummyFragment();
             return result;
        }

        @Override
        public int getCount() {
            return 5;
        }

    }

Constructor 생성시 behvior에 'BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT'를 추가해주면 된다.

 

 

 

 

Reference

https://stackoverflow.com/questions/51131172/fragmentstatepageradapter-is-deprecated-from-api-27

 

728x90
728x90

 

출처: http://blog.devez.net/340

Activity

Activity에서 Display 사이즈를 가져오는 방법이다.

int getDisplayWidth(Activity activity){

    DisplayMetrics metrics = new DisplayMetrics();

    activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);

    return metrics.widthPixels;    

}

Context를 이용해서 Display 사이즈를 가져오는 방법이다.

 

Context

Display 클래스의 getWidth 메소드는 API Level 13부터 deprecated되었고 getSize 메소드를 사용해야한다.

 

@TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2)

int getDisplayWidth(Context context){

    int width=0;

    WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);

    Display display = wm.getDefaultDisplay();

    if(Build.VERSION.SDK_INT>12){

        Point size = new Point();

        display.getSize(size);

        width = size.x;

    }

    else{

        width = display.getWidth();  // Deprecated

    }

    return width;      

}

 

 

728x90
728x90

 

 

1. 지문인식 기능의 시작

- API 23버전 마시멜로부터 추가된 기능

- 따라서 프로젝트 설정도 마시멜로 이상으로 설정해야 적용 가능

 

2. 지문인식 기능

(1) API 27버전까지 사용하던 FingerprintManager 기능

1. 프로젝트 Manifest 파일에 지문인증 권한을 요청

2. 잠금화면이 고정된 기기에만 지문등록이 가능하므로 잠금화면 설정이 되어 있는지 확인

3. 폰에 하나 이상의 지문이 등록 되어 있는지 확인

4. FingerprintManager 클래의 인스턴스 생성

5. Keystore 인스턴스로 안드로이드 Keystore 컨테이너에 액세스

6. KeyGenerator 클래스로 암호화된 키 생성하여 Keystre에 저장

7. 앞 단계에서 생성된 키를 이용 Cipher 클래스 인터턴스 초기화

8.Cipher 인스턴스를 사용하여 CryptoObject를 만들고 FingerprintManger 인스턴스에 지정

9. FingerprintManager 인스턴스의 authenticate 메소드를 호출

10. 인증 프로세스에 의해 트리거 된 콜백을 처리 메소드 구현

 

[출처] 안드로이드 지문인증 사용하기(1) : Fingerprint Authentication|작성자 코스모스

 

(2) API 28버전부터 통합된 BiometricPrompt방식

 

구글문서

https://developer.android.com/reference/android/hardware/biometrics/BiometricPrompt.html

 

구현방법

https://new-spring-bom.tistory.com/3

 

 

Reference

https://blog.naver.com/cosmosjs/221381903806

https://namget.tistory.com/entry/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%A7%80%EB%AC%B8%EC%9D%B8%EC%8B%9D-%EB%B3%80%EA%B2%BD%EC%A0%90

https://source.android.com/security/biometric

https://new-spring-bom.tistory.com/3

https://developer.android.com/reference/android/hardware/biometrics/BiometricPrompt.html

 

728x90
728x90

 

1. 화면 제어 기초 (한번만 고정할 경우)

 

안드로이드 앱에서

1) 화면을 가로, 세로로 고정시키거나

2) 앱 내에서 API 를 사용해서 센서를 변경하는 방법

 

앱의 화면을 세로(portrait) 또는 가로(landscape) 로 고정하고자 할 경우는 AndroidManifest.xml 에 속성을 지정하면 됩니다. screenOrientation 속성값을 portrait 또는 landscape 로 설정하면 됩니다. (추가적인 속성은 레퍼런스를 참고)

 

<activity
    android:name=".MainActivity"
    android:label="@string/app_name"
    android:theme="@style/AppTheme.NoActionBar"
    android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
    android:screenOrientation="portrait">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

 

프로그램 내에서 화면을 가로 또는 세로로 고정하거나 센서를 활성화 시키고자 할 경우는

액티비티(Activity) 의 setRequestedOrientation 메소를 사용하면 됩니다.

 

참고로 setContentView가 호출되기 전에 setRequestedOrientation이 호출되어야 함

 

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    
    //세로 화면으로 고정      
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    //가로 화면으로 고정
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
          
    setContentView(R.layout.main_activity);
}

 

 

 

만약 고정을 풀고 센서를 활성화 하려면 다음과 같이 하면 됩니다.

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);

 

 

위의 메소드를 이용하면 특정 상황에서 화면 모드를 설정하고 센서를 활성화 시키는 등의 작업이 가능합니다.

 

 

 

2. 화면 회전을 중간에 변경해야할 경우

2-1. 바람직하지 않은 방법 (1)

  • AndroidManifest.xml에서 모든 Activity에 다음을 추가 한다
android:screenOrientation="portrait" //--- 세로 화면 고정
android:screenOrientation="landscape" //--- 가로 화면 고정

2-1. 바람직하지 않은 방법 (2)

public void onCreate(Bundle savedInstanceState) 함수에서 
setContentView(~); 다음에 아래 라인을 추가 한다. 

// 세로 화면 고정
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
// 가로 화면 고정
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 

 

2-2. 화면이 회전해도 Activity가 다시 로딩되지 않도록 하는 방법

안드로이드의 경우 화면이 회전되었을 경우 화면을 종료시키고 새로운 layout으로 재 시작한다. 즉 세로화면 -> 가로화면으로 전환 시 onDestroy() 함수가 호출되고 가로모드에서 다시 onCreate() 함수가 호출된다. 환경변화가 일어날 경우 기본적인 동작은 activity 의 재시작이다.

 이럴때 AndroidManifest.xml 파일에 ` android:configChanges`을 설정함으로써 activity가 reset되는것을 막을 수 있다. 이런경우 activity의 onDestroy()와 onCreate() 함수 대신에 onConfigurationChanged()함수가 호출된다.

 이러한 옵션이 왜 필요한지 예를 들어보자. 사용자의 이름을 입력하는 Edittext를 1개 포함하는 화면이 있다고 하자. 화면이 처음 구성되는 onCreate()함수에서 사용자의 이름변수를 null로 초기화 하고, 화면이 구성된 이후에 사용자가 이름을 입력하였다. 만약 이때 화면이 가로모드에서 세로모드로 변경되면 화면이 종료되고 다시 시작되기 때문에 사용자의 이름변수는 다시 null이 입력되어 있게 된다. 이런 상황에서 원하는 동작은 사용자가 이름을 입력하였기 때문에 Edittext는 사용자가 입력된 내용을 그대로 유지하고 있어야 한다. 이럴때 configChanges 옵션중에서 orientation 옵션을 주면 화면의 방향이 변경되어도 초기화 되지 않는다.

 

Activity가 다시 로딩되지 않으므로 화면의 크기는 변하지 않는다. 따라서 수작업으로 화면을 조정해 주어야 한다.

android:configChanges="orientation | keyboardHidden"

 

위의 옵션은 화면의 방향이 변해도 화면이 초기화 되지 않도록 (android:configChanges="orientation") 한다.

위처럼 | 로 여러개를 셜정할 수 있는데, “keyboardHidden”는 User 가 Hardware Keyboard를 보이고 감추는 등의 Keyboard의 Accessibility가 변경되었을 때의 옵션이다.

 

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    switch(newConfig.orientation) {
        case Configuration.ORIENTATION_PORTRAIT:   
            //--- 수작업으로 세로 화면 생성
            break;
        case Configuration.ORIENTATION_LANDSCAPE:  
            //--- 수작업으로 가로 화면 생성
            break;
    }
}

 

 

화면 회전시 정보를 저장한 후 복구하는 방법

(1) public void onCreate(Bundle savedInstanceState)에 복구와 관련된 코딩을 한다.

(2) public void onDestroy()에 화면 종료와 관련된 코딩을 한다.

 

 

3. 현재 회전 상태 체크 방법

if(getWindowManager().getDefaultDisplay().getRotation() == Surface.ROTATION_90) {
    //가로 모드 일 때
}else{
    //세로 모드 일 때
}

기존에는 .getOrientation()  으로 체크하였으나 최근에는 .getRotation()을 사용하고 있습니다. 리스너로 확인 할 수 있습니다.

getWindowManager().getDefaultDisplay().getOrientation()
getWindowManager().getDefaultDisplay().getRotation()

 

 

Reference

http://www.fun25.co.kr/blog/android-screen-orientation

https://blog.miyam.net/89

https://plogds.tistory.com/265

http://jinyongjeong.github.io/2018/09/30/configchange_option/

https://faith-developer.tistory.com/10

728x90

+ Recent posts