Android - 화면을 Full Screen 으로 만들기.


 안녕하세요. 오랜만에 글 쓰네요.
 오늘 포스팅할 내용은 android full screen - Immersive mode - 몰입 모드 입니다.

 android 핸드폰을 쓰다 보면, 상단에 위치한 스테이터스바와 하단에 위치한 소프트키(네비게이션 바)가 '걸리적 거린다.' 라고 느껴질 때가 종종 있습니다. 책을 읽는다거나 동영상을 보거나 게임을 할 때 말이죠.

 Froyo 나 Gingerbread 가 많이 사용되던 시절에는 하단에 소프트키가 아닌 버튼들이 위치해 있었기 때문에 크게 불편하진 않았습니다. 그런데 언젠가부터 google 에서는 소프트키를 선호하기 시작했습니다. 액정을 크게 만들고 그 안에 소프트키를 넣었지요. 그러다보니 어플을 사용하다 보면 실수로 소프트키를 누르는 일들이 빈번히 생기게 되었습니다.

 google 은 이 문제를 전체화면 보기인 몰입 모드를 통해서 해결하려고 했던 것 같습니다. KitKat(android 4.4) 이상 부터는 코드 몇 줄로 이 해결책을 사용할 수 있습니다.

 우선 소스코드를 먼저 보시죠.

 생각보다 짧지요?
 DecorView 라는 녀석을 받아와서 SystemUiVisibility 설정값을 바꿔주면 된다...  라고 위 소스코드를 요약할 수 있겠습니다.

 그렇다면 DecorView 란 무엇일까요?
 android 개발자 사이트에 getDecorView() 를 'Return the top-level window decor view.' 라고 정의하고 있습니다. DecorView 가 top-level window 중의 하나라고 볼 수 있을 것 같습니다.
 google software engineer 인 Romain Guy 는 Decor View 를 이렇게 정의했습니다.
 'The DecorView is the view that actually holds the window's background drawable.'
 제 짧은 영어실력으로 번역을 해보자면, 'DecorView 는 실제로 윈도우의 배경 drawable 을 담고 있는 view 이다.' 정도 일까요.
 ... 생각보다 중요한 역할을 하는 녀석이네요...

 이 녀석에게서 현재 SystemUI 에 대한 정보도 받아올 수 있는데요.
 이 정보를 받아와서 우리가 원하는 값들을 추가해보도록 하지요.

 추가해줘야 하는 값은 총 3개입니다.
 1. SYSTEM_UI_FLAG_HIDE_NAVIGATION
 2. SYSTEM_UI_FLAG_FULLSCREEN
 3. SYSTEM_UI_FLAG_IMMERSIVE_STICKY

 SYSTEM_UI_FLAG_HIDE_NAVIGATION 은 하단 소프트키를 담고 있는 네비게이션 바를 가려주는 flag 입니다. 이 값은 'API level 14' 를 요구합니다. 그래서 위 소스에서도 현재 빌드 버전이 ICS 이상에서만 적용되도록 if 문을 걸어주었습니다.

 SYSTEM_UI_FLAG_FULLSCREEN 는 상단 상태창을 가려주는 flag 입니다. 이 값은 'API level 16' 을 요구합니다. 그래서 Jelly bean 이상에서만 적용되도록 if 문을 걸어주었습니다.

 여기까지만 값을 적용해줘도, 처음 프로그램을 실행할 때는 full screen 을 볼 수 있습니다. 하지만 터치 한번하면 상단과 하단 바가 모두 나타나버립니다. 때문에 중요한 flag 가 SYSTEM_UI_FLAG_IMMERSIVE_STICKY 입니다.

 SYSTEM_UI_FLAG_IMMERSIVE_STICKY 는, sticky 라는 단어가 가지고 있는 의미처럼 스티커처럼 달라붙게 해줍니다. 이 값까지 적용을 해주면 터치를 해도 상*하단 바가 나타나지 않습니다.
 다시 상*하단 바를 보려면 손가락으로 화면을 스크롤 해주면 됩니다. 이 때도 완전히 나타나는 것이 아니라 잠시 나타났다가 다시 사라집니다.
 이 값은 'API level 19' 를 요구합니다. 그래서 Kitkat 에서만 동작할 수 있도록 if 문을 걸어주었습니다.

 여기까지만 하면 full screen 으로 어플을 즐기실 수 있습니다.
 그런데, 테스트를 하다가 조금 이상한 점을 확인할 수 있었는데요.
 AlertDialog 나 ProgressDialog 같은 Dialog 를 호출하면 가려져있던 bar 들이 나타납니다. 그리고는 사라지지 않는 경우가 생기더군요.

 저는 위 문제를 'onWindowFocusChanged()' 를 override 해서 해결했습니다.
 그리고 윈도우가 focus 를 받을 때 decorview 에 값을 세팅하도록 코드를 수정했지요.

 아래는 수정된 소스 코드입니다.

 네, 준비한 내용은 여기까지입니다.

 약 7~8 개월 만에 새로운 포스팅을 올려봤습니다. 이래저래 복잡한 일들이 있어서 블로그에 포스팅하는 일에 소홀했었네요.
 더 많이 공부하고, 더 많이 배워서 이 곳에 올리도록 하겠습니다;

 읽어주신 모든 분들, 감사합니다.




Loading ....

CloudD

예술하는 프로그래머, 코딩하는 예술가

60 댓글

  1. 와 감사합니다. 홈버튼 바가 사라지지 않고 계속 발생해서 애먹었는데 해결했네요.

    답글삭제
  2. 정말 큰절이라도 드리고 싶은 마음입니다. 몇시간 동안 문제가 해결되지 않아(black screen 및 navigation bar 출현) 포기할까 생각하다가 이 글 보고 해결했네요. 감사합니다.

    답글삭제
  3. 감사합니다. 클래스로 따로 정의해서 쓰면 매우 편리하네요!

    답글삭제
    답글
    1. 도움이 된 것 같아서 다행입니다 ~

      삭제
  4. 놀랐습니다. 정말 감사합니다.
    혹시 질문하면 답변해 주실 시간은 있으실지 ...
    반드시 건강하세요.

    답글삭제
    답글
    1. 감사합니다.
      질문하셔도 괜찮습니다.
      다만 저도 아는 것이 많지는 않아서, 제가 아는 선에서만 답변 해드릴 수 있습니다.
      병희님도 건강하세요.

      삭제
  5. 참, 메인 화면에서는 풀스크린이 되는데 메소드를 실행하여 들어가면 상단 하단 다시 나타나는군요.
    그것이 정상적인 상태인지?
    자바와 안드로이드는 처음이라서 ...

    답글삭제
    답글
    1. AlertDialog 를 출력하거나 하는 등의 기능을 수행하면, 또는 상단과 하단에 스크롤을 하면 상태창 등이 다시 나타나긴 합니다. 네비게이션 바와 스테이터스 바 등을 완벽하게 제어하는 방법을 찾아보기는 했었는데 찾지는 못했네요...
      그런데... 이것들을 아예 안 나타나게 하면 그건 그것대로 문제일 것 같긴 합니다;

      삭제
  6. 글은 몇 편 없는데 눈이 부시는군요.
    혹시 시간이 나시면, 상단에 목록보기 하나 붙여 주시면 보기 편하겠습니다.
    수고하세요.

    답글삭제
    답글
    1. 일을 하다가 공부하게 된 내용들을 (한참 뒤에서야) 정리하는 블로그다보니... 내용이 조금 많이 부실합니다;
      급한 일들 다 정리되면 다시 열심히 공부해서 채워보려고 합니다 하하;;
      그 때가 되면 목록도 잘 정리해서 출력해보도록 하겠습니다.
      감사합니다.

      삭제
  7. 자동으로 만들어주는 프로젝트에 CloudD 님의 소스를 나누어서 'private 변수 선언/onCreate 내 코딩/onWindowFocusChanged 메소드 오버라이드'하니 아주 깨끗해집니다.
    그런데 액션바(My Application 출력) 부분은 그대로 남더군요.
    혹시나 하고 AndroidManifest.xml 테마 속성을 android:theme="@style/Theme.AppCompat.DayNight.NoActionBar" 선택하니 없어지더군요.
    네이버 검색을 많이 사용하는데, 이 페이지 찾는 것이 쉬운 일이 아니라 님의 소소 소개에 사이트 링크를 붙이고 제가 사용한 방법도 설명해서 지식인에 올려 두렵니다.
    지우라고 하시면 바로 지우겠습니다.
    수고하시고 건강하세요.

    답글삭제
    답글
    1. ActionBar 부분은 지금 하신 것 처럼 theme 를 변경해주셔야 하는 것이 맞습니다. 그게 아니면 activity 에 requestWindowFeature(Window.FEATURE_NO_TITLE); 라는 걸 적어주는 방법이 있습니다.
      그리고 저도 제 공부를 정리하면서 블로그에 업로드한 것 뿐이라, 출처 혹은 링크만 달아주신다면 큰 상관이 없을 것 같습니다.
      병희님도 수고하시고, 건강하세요.

      삭제
    2. 감사합니다.
      그 내용을 super.onCreate... 아래 setContentView... 위에 삽입하면 된다고 여러 사람들이 설명하는데 저는 안 되더군요.
      지금 다시 테스트해 보았는데 또 안 됩니다.
      그래서 마지막 자구책으로 테마 변경을 시도했습니다.

      삭제
    3. 아 찾았습니다.
      AppCompatActivity를 extends해서 안 된 것이더군요.
      하나씩 찾는 게 힘도 들지만 보람도 있습니다.

      삭제
  8. 작성자가 댓글을 삭제했습니다.

    답글삭제
  9. ======================
    API Level 17 부터 보안상의 이유로 두 속성 다 deprecated 되었고
    ContentProvider나 BroadcastReceiver나 Service를 이용하여 interaction 할 것을 권장하고 있습니다.

    This constant was deprecated in API level 17.
    Creating world-writable files is very dangerous, and likely to cause security holes in applications. It is strongly discouraged; instead, applications should use more formal mechanism for interactions such as ContentProvider,BroadcastReceiver, and Service.
    ======================
    위 설명을 참고하여
    openFileOutput(string, Context.MODE_WORLD_READABLE);
    대신
    openFileOutput(string, Context.MODE_...);
    ... 부분에
    ContentProvider
    CONTENTPROVIDER
    어느 쪽을 입력해도 컴파일이 되지 않는데,
    Error:(28, 79) error: cannot find symbol variable CONTENTPROVIDER
    인터넷을 뒤져도 제가 알아볼 수 있는 설명을 찾지 못했습니다.
    시간 되시면 좀 부탁을 드립니다.
    안녕히 계십시오.

    답글삭제
    답글
    1. 음... 이 내용은 제가 포스팅한 것과는 별개의 내용이군요.
      파일 입출력 쪽을 보고 계신 것 같은데, 실례가 안된다면 지금 작업하고 계신 프로젝트를 압축해서 제 메일로 보내주시겠어요? 코드를 한번 리뷰해드릴 수는 있을 것 같거든요. 제 메일은 leehj1321@gmail.com 입니다.
      일단 위에 적어주신 정보만 가지고 보면 'CONTENTPROVIDER' 라는 변수를 선언하지 않았기 때문에 오류가 발생했습니다. 해당 변수를 선언해주시고 다시 빌드해보세요.

      삭제
    2. 정말로 친절하시군요.
      압축파일 첨부 메일 보내 드렸습니다.
      감사합니다.
      참 그러고 MODE_WORLD_READABLE 굳이 안 쓰고
      MODE_PRIVATE 해도 남들이 볼 수는 있는 것 아닌가요?

      삭제
  10. 아래 내용으로 메일 보냈습니다.
    -
    풀스크린
    MainActivity.java

    멤버변수

    private View decorView;
    private int uiOption;

    onCreate

    decorView = getWindow().getDecorView();
    uiOption = getWindow().getDecorView().getSystemUiVisibility();
    if( Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH )
    uiOption |= View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
    if( Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN )
    uiOption |= View.SYSTEM_UI_FLAG_FULLSCREEN;
    if( Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT )
    uiOption |= View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;

    포커스

    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
    if( hasFocus) {
    decorView.setSystemUiVisibility( uiOption );
    }
    }

    위 코드 잘 먹혔는데, 안 먹히는 경우를 발견했습니다.
    FragmentTabHost + ViewPager 실현한 소스 얻어와서 돌리는 중에 ...
    -
    아?
    지금 보니 안 먹힌 게 아니고 가운데 그려진 스테이터스바가 위로 올라가지 못하고, 탭메뉴가 아래로 내려가지 못하군요.
    타이틀바부터 탭메뉴까지 height가 고정되어 있는 듯한데 ...
    -
    그래서 프로젝트의 모든 소스에서 height 검색해서 살펴 보았는데,
    제 실력으로 알 수가 없군요.
    도와 주세요.
    -
    FragmentTabHost-master_02.zip
    프로젝트 압축파일 첨부합니다.

    답글삭제
    답글
    1. 메일을 다시 한번만 확인해주세요.
      저한테 메일이 오지 않았습니다.

      삭제
  11. gmail.com 전송실패

    재전송했습니다.
    그리고, 액션바 지우기
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    에러 납니다.
    대신
    supportRequestWindowFeature(Window.FEATURE_NO_TITLE);
    사용하면 에러 나지 않습니다.

    그런데, 또 전송실패
    제가 받은 url

    https://github.com/hlgao/FragmentTabHost

    입니다.
    최근 업데이트되었는지, 받아서 풀면 바로 컴파일됩니다.
    제가 찾던 소스 - 그것도 저를 완벽하게 만족시킨 소스입니다.

    수고스럽지만 한 번 받아서 테스트 부탁 드립니다.

    감사합니다.

    답글삭제
    답글
    1. 작성자가 댓글을 삭제했습니다.

      삭제
    2. http://blog.daum.net/andro_java/111 페이지에 정리해 두었습니다.
      -
      해결되었습니다.
      http://developer.android.com/intl/ko/training/system-ui/status.html
      페이지 아래쪽의
      Make Content Appear Behind the Status Bar
      제목 글에서
      android:fitsSystemWindows 속성을 사용하면 풀스크린 구현된 레이아웃도 상하 status 안쪽으로 높이를 제한할 수 있다는 사실을 대충 파악하고
      activity_main.xml
      파일에서
      android:fitsSystemWindows="true"
      줄의 값을 false로 수정하거나
      아예 지워버리니 시원하게 늘어납니다.
      감사합니다.

      삭제
    3. 해결하셨다니 다행입니다.
      고생하셨습니다.

      삭제
  12. 작성자가 댓글을 삭제했습니다.

    답글삭제
  13. 테그 때문에 글이 보이지 않아서 다시 올립니다.

    ScrollView 안에서 EditText 의 onTouch 가로채이는 문제

    TextToSpeech 앱을 개발하고 있습니다.
    기본적인 문제는 대부분 해결했는데 하나 걸리는 것이 남아서 질문 드립니다.

    스크롤뷰에 에디트텍스트를 담아서 보여주며, 터치이벤트가 발생하면 그에 따른 처리를 해주고 있습니다.

    그런데 스크롤뷰가 터치이벤트를 가로채서 처리 결과가 원하는 대로 나오지 않고 있습니다.

    스크롤뷰를 벗겨버리면 정상적인 결과가 나오는 코딩을 했음에도 스크롤뷰에 막히는 문제를 해결해야 됩니다.

    에디트텍스트 자체만으로는 스크롤이 너무 느려서 답답하기 때문에 스크롤뷰를 버릴 수 없습니다.

    1. 커스텀 텍스트뷰

    시도해 보았으나, 실력이 짧아 성공하지 못했습니다.

    2. requestDisallowInterceptTouchEvent

    사용하면 스크롤이 되지 않고, 아무리 구글링하면서 베껴 돌려 보아도 스크롤도 코딩한 대로의 결과도 얻을 수 있는 requestDisallowInterceptTouchEvent 사용방법을 터득하지 못했습니다.

    3. 어떤 방법이든지 무관

    스크롤도 시원하게 되고, 터치이벤트에 따른 처리도 코딩한 대로 되는 소스코드가 필요합니다.
    커스텀 텍스트뷰로 구현하든지 requestDisallowInterceptTouchEvent 를 적절한 시점에 켰다 끄든지 어떤 방법이든지 위 요구사항만 만족되면 충분합니다.

    4. 상업적 의뢰 직전임

    애써 만든 앱을 혼자 사용하기 아까워서, 이 질문의 답변을 받아서 해결하지 못하면 샘플제작업체에 의뢰할 생각입니다.

    마지막 SOS에 도움 주시면 감사하겠습니다.
    관련 부분의 소스 발췌하여 붙입니다.
    프로젝트 전체 소스가 필요하면 메일을 가르쳐 주시기 바랍니다.

    감사합니다.

    - 레이아웃 -

    &gtScrollView
    android:id="@+id/scrollView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#cecfce"
    android:fillViewport="true">

    &gtEditText
    android:editable="false"
    android:inputType="none"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/tts_editText"
    android:textSize="18sp"
    android:lineSpacingExtra="13dp"
    android:text="고전 1:27 그러나 ㅓ하나님께서 世上의 미련한 것들을 擇하사 智慧 있는 者들을 부끄럽게 하려 하시고 ㅕ世上의 弱한 것들을 擇하사 强한 것들을 부끄럽게 하려 하시며 // ㅓ 약 2:5 ㅕ 시 8:2"
    android:maxLength="100000"
    android:textIsSelectable="true"
    android:textColorHighlight="#cdefab"
    android:padding="3dp"
    android:gravity="top" />

    &gt/ScrollView>

    - 자바소스 -

    public class MainActivity extends AppCompatActivity implements OnInitListener, OnTouchListener {

    private static EditText tts_editText, helpText;
    private static ScrollView scrollView;

    protected void onCreate(Bundle savedInstanceState) {
    ...
    tts_editText = (EditText)findViewById(R.id.tts_editText);
    tts_editText.setOnTouchListener(this);

    scrollView = (ScrollView)findViewById(R.id.scrollView);
    }

    ...

    @Override
    public boolean onTouch(View v, MotionEvent event) {
    _LAST_ACTION = event.getAction();
    if (_LAST_ACTION==1) _LAST_ACTION = 3;

    String bmText;

    switch(event.getAction()) {
    case MotionEvent.ACTION_DOWN:
    x1 = event.getX();
    break;
    case MotionEvent.ACTION_UP:
    x2 = event.getX();
    dx = x2-x1;

    if(dx>50) { // (오른쪽)
    if(dx>100) {
    if (!_LAST_FILE.isEmpty()) {
    bmText = makeBookmark(al_bookMark, _LAST_FILE, tts_editText, event);
    if (!bmText.isEmpty()) {
    Toast.makeText(this, "===> Add bookmark !!!", Toast.LENGTH_SHORT).show();
    saveBookmark(bmText, al_bookMark);
    saveBookmark(makeClone(bmText), al_bookMarkClone);
    lv_bookmark.setAdapter(bmAdapter);
    }
    }
    }
    else interSpeech(event);
    }
    else if(dx<-50) { // direction = "(왼쪽)";
    if (mTTS.isSpeaking()) mTTS.stop();
    }
    break;
    }

    // return true;
    return super.onTouchEvent(event);
    }
    }

    답글삭제
    답글
    1. 안녕하세요.
      어떤 걸 만들고자 하시는지는 알 것 같습니다.
      하지만 전체 코드를 봐야 뭔가 도움을 드릴 수 있을 것 같습니다.
      leehj1321@hanmail.net 으로 프로젝트를 압축해서 보내주시겠어요?
      오늘 밤에 한번 훑어보겠습니다.

      삭제
  14. 메일은 잘 받으셨는지요?
    지금 스크롤뷰에 막힌 문제는 2가지입니다.
    1.
    보이는 화면으로 Cursor 이동시키기, moveCursorToVisibleOffset
    이것이 반드시 해결할 문제입니다.
    2.
    private void scroll_top(EditText eText, int p) {
    Layout layout = eText.getLayout(); // eText의 Layout 객체를 구한다.

    int line = layout.getLineForOffset(p); // 첫 글자가 속한 줄의 Offset
    int top = layout.getLineTop(line); // 줄 글자들의 윗선 위치(baseline + ascent와 같은 값)

    eText.scrollTo(0, top); // top 대신 bottom 지정하면 한 줄이 위로 올라가 보이지 않는다.

    }
    이 메소드를 써도 스크롤뷰에 담겨 있으면 화면 밑에 붙어서 보입니다.

    바쁘실 텐데 질문 드려서 미안합니다.

    답글삭제
  15. 테스트해본 것들도 다시 찾으려니까 힘듭니다.
    겨우 찾아서 우격다짐으로 다음과 같이 순진한 코딩을 했는데 ...
    moveCursorToVisibleOffset
    는 성공했다는 신호를 보내면서 항상 옵셋 21만 내보냅니다.

    private void onSpeech() {
    if (inc_help.getVisibility()==View.VISIBLE)
    arrSpeak(et_help.getText().toString().split("\n"));
    else {
    if (_fileText.isEmpty()) Snackbar.make(inc_tts, "탐색(선택)하지 않은 파일은 스피커 아이콘으로 읽으세요!", Snackbar.LENGTH_LONG).show();
    else {
    scrollView.requestDisallowInterceptTouchEvent(true);
    tts_editText.setSpannableFactory(Spannable.Factory.getInstance());
    if (tts_editText.moveCursorToVisibleOffset()) {
    int pos = tts_editText.getSelectionStart();
    textView.setText(""+pos);
    scrollView.requestDisallowInterceptTouchEvent(false);
    arrSpeak(File_Text.offRightText(tts_editText, pos).split("\n"));
    }
    else {
    Snackbar.make(inc_tts, "??? 커서를 움식일 수 없어요, 엉, 어엉!", Snackbar.LENGTH_LONG).show();
    scrollView.requestDisallowInterceptTouchEvent(false);
    }
    }
    }
    }
    실패했다고 하든지, 성공했으면 옵셋 수치를 달리 내보내든지 ...
    잠도 못자고(잠이 오지 않아서) 기억을 살려서 내가 이것까지 해 보았다는 기록 겸 부끄럽지만 올려봅니다.

    답글삭제
  16. 많은 페이지를 참고한 끝에, 스스로 답을 찾았습니다.
    아래는 저의 개발일지 메모입니다.
    -
    스크롤뷰에 담지 않은 EditText 의 텍스트를 마치 스크롤뷰에 담은 것처럼 스크롤시키는 기능을 구현하기 위해 참고한 소스들과 삽질 과정을 순서번호를 붙여서 올리고 있다.
    뷰(Button/TextView/EditText)에 Scroller 달기(1)/[Android] http://blog.daum.net/andro_java/187
    뷰(Button/TextView/EditText)에 Scroller 달기(2)/[Android] http://blog.daum.net/andro_java/191
    뷰(Button/TextView/EditText)에 Scroller 달기(3)/[Android] http://blog.daum.net/andro_java/192
    뷰(Button/TextView/EditText)에 Scroller 달기(4)/[Android] http://blog.daum.net/andro_java/193
    뷰(Button/TextView/EditText)에 Scroller 달기(5)/[Android] http://blog.daum.net/andro_java/194
    이것으로 준비는 끝났다.

    이제 우리 앱에 적용하는 일만 남았다.

    답글삭제
  17. 바쁘실 텐데 제 블로그까지 방문해주셨더군요.
    감사합니다.
    정리 과정에 만든 소스 다 지워버리고 찾지 못하다가, 여기 질문 올려둔 데서 찾았네요, 하하하!
    다시 한 번 감사 드립니다.

    답글삭제
  18. 중요한 부분에 색상이 ㅠㅠ 노란 바탕에 그레이...글씨만 노란색으로 했으면 더 잘 보일텐데요...

    답글삭제
    답글
    1. 아, 저 부분을 깜빡했네요;
      원래 배경이 흰색이었거든요.
      저건 다시 수정해둬야겠네요;
      지적 감사합니다 ㅎㅎ

      삭제
  19. 이 페이지에서 처음 선생님을 뵌 것 같습니다.
    2016년 3월 8일 오후 10:32
    스탬프가 남아 있네요.
    8개월 배우면서 만든 앱을 플레이스토어에 공개 베타로 올려 인사 드립니다.
    관주성경 TTS 앱 Bible_ro : 플레이스토어 '관주성경' 검색.
    선생님께는 인사 드리러 왔고 혹시 보실 분들 생각해서 ...
    항상 감사하옵고, 건강하세요!

    답글삭제
    답글
    1. 와, 고생 많으셨습니다.
      제가 뭔가 도움을 드리거나 알려드린 것은 없는 것 같지만, 꾸준히 찾아와주셔서 감사합니다.
      여전히 회사 일 때문에 블로그가 업데이트 되고 있진 않지만, 저도 꾸준히 공부해서 뭔가 만들고 인사드리겠습니다.
      병희님도 건강하세요~

      삭제
  20. 안녕하세요. 포스팅 너무 잘 보고 배워갑니다.
    한가지 질문이 있습니다.
    몰입모드 진입 후 상태바나 내비게이션바를 아예 노출되지 않도록 하는 방법도 있을까요? 이래저래 해봤는데 저는 방법을 찾질 못했네요 ㅜㅜ

    답글삭제
    답글
    1. 제 포스팅이 도움이 되었다면 다행입니다 ㅎ
      질문하신 것이 제가 명확히 이해가 안 되어서 그러는데요...

      1. 앱을 실행 했을 때.
      2. 해당 영역(바가 있었던 부분)을 스크롤 해서 상태바와 내비게이션바가 다시 나타났을 때.

      혹시 1번과 2번 중 어느 부분에서 상태바와 내비게이션바가 보여지고 있나요?

      삭제
    2. 제가 질문을 잘 못했군요^^;;;

      포스팅 내용 그대로 사용했더니 상태바와 소프트키는 스크롤 터치 시 정상적으로 노출되었다가 일정 시간이 지나면 사라집니다. 아주 정상적이죠 ㅎㅎ

      제가 구현하고 싶은것은 스크롤 터치를 해도 상단바와 소프트키가 노출 자체가 안되었으면 합니다. 혹시 방법이 있을까요?

      삭제
    3. 만약 그렇게 만든다면, 잠금화면을 제작 하듯이 만들어야 할 것 같은데요.
      이 또한 해본 적이 없는 부분이라 말씀드릴 수 있는 것이 없네요;;
      질문해주셨는데, 죄송합니다;; 하하;;

      삭제
    4. 그렇군요.ㅎㅎ 혹시나 방법을 찾게 되면 댓글 남기겠습니다^^;;

      삭제
  21. 제가 지금 애먹고 있는데 혹시 아시는 부분이면 답좀 해주세요ㅠㅠ정보를 받아서 상태바(배터리 와이파이등 표시되는곳..) 색깔을 바꾸려고 하는데 앱안에서는 되게 했는데 이걸 (서비스에서?) 백그라운드로도 적용하게 하는걸 못하겠어요. 앱에서 받은 정보에 해당하는 색이 파랑이면 앱화면에서는 파랑으로 변하는데 앱을 나가서 바탕화면 상태바에서도 계속 바껴있게 하고 싶거든요. 혹시 하시는법 아시나요..?

    답글삭제
    답글
    1. 음... 아니요; 죄송합니다; 해당 부분은 잘 모르겠네요... ㅠ
      아마도 홈으로 나가면 상태바가 기본 홈의 성질을 따라가기 때문에 변경이 어렵지 않을까 싶습니다...
      도움을 드리지 못해 죄송하네요 ㅠ;

      삭제
  22. 아니에요. 저도 하다가 안되서 결국 아이콘으로 바꿨어요. 윈도우매니저쓰면 된다는데 잘 모르는 명령어에 뷰가 없어서 안되더라고요. 생각해주셔서 감사합니다~

    답글삭제
  23. 도와 주세요.
    질문 내용이 길어서 아래 페이지에 올려 두었습니다.

    경고 없이 정확하게 AsyncTask에 파라미터를 전달하는 방법/[Android] http://blog.daum.net/andro_java/936

    짬을 내어 도와주신다면 정말로 감사하겠습니다.

    답글삭제
    답글
    1. 제가 사용하는 방법을 해당 게시물 댓글에 달아두었습니다. 도움이 될 수 있으면 좋겠네요...

      삭제
  24. 감사합니다.
    참고하겠습니다.

    답글삭제
  25. 감사합니다. 그런데 제가 잠금화면 어플을 만들어보고있는데 잠금화면이다보니 서비스를 사용합니다. 그럴때는 어떻게 해야할지요...ㅠㅠ

    답글삭제
    답글
    1. 봐주셔서 감사합니다.
      서비스를 사용하시는 부분에서 어떤 점이 잘 안되시나요? 막히는 부분을 알려주시면 미약하게라도 도움 드릴 수 있을 것 같습니다.

      삭제
  26. 이 글을 봐주실지 모르겠지만 너무 답답해서 이렇게라도 댓글을 달아봅니다ㅠ
    지금 근 일주일째 풀스크린을 못만들고 해매고 있어요ㅠㅠ
    저에 문제점은 상단 타이틀바와 하단 네비게이션바가 가려지는것까진 잘 되는데
    네비게이션바가 내려간 자리가 하얗게 여백이 되어 그부분을 사용되어지지
    않고 풀스크린을 사용하지 못하고 있습니다.ㅠㅠ
    이 여백을 어떻게 처리해야 할지 조언좀 부탁드려요 제발 ㅠ

    답글삭제
  27. 제 소스입니다 제발 조언 좀 부탁드립니당 ㅠㅠ;

    public class main extends AppCompatActivity {


    private View decorView;
    private int uiOption;

    @Override
    protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);

    supportRequestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);

    setContentView(new playView(this));

    decorView = getWindow().getDecorView();
    uiOption = getWindow().getDecorView().getSystemUiVisibility();
    if( Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH )
    uiOption |= View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
    if( Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN )
    uiOption |= View.SYSTEM_UI_FLAG_FULLSCREEN;
    if( Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT )
    uiOption |= View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
    }

    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
    // TODO Auto-generated method stub
    // super.onWindowFocusChanged(hasFocus);
    if( hasFocus ) {
    decorView.setSystemUiVisibility( uiOption );
    }
    }

    답글삭제
    답글
    1. 안녕하세요-
      오래된 글을 봐주셔서 감사합니다.

      댓글로 올려주신 코드도 확인했습니다. 다만 오늘까지는 제가 코드를 보긴 어려울 것 같습니다. 주말에 확인해서 댓글을 다시 달도록 하겠습니다.

      삭제
    2. 아 봐주셔서 너무너무 감사합니다
      일주일째 이러고 있는데 여기저기 온갖 자료를 보고 따라해도 타이틀바랑 네비게이션바가 사라진 자리에 하얀 여백이 채워지질 않습니다.
      이렇게 신경써주신다니 정말 감사드립니다. 혹시 다른부분 소스가 필요하시다고 말씀해주시면 문제될 부분 다 올려놓도록 하겠습니당 감사해요~ 주말 잘보내시구요~~
      ㅠㅠ

      삭제
    3. 안녕하세요. 너무 늦게 답을 드려서 죄송합니다.
      제가 가지고 있는 단말기(version 6.0.1 과 version 9)에서, 댓글로 달아주신 코드를 실행해 봤습니다.
      가장 기본적은 layout 파일로 한번, custom layout 을 만들어서 한번 실험 했습니다.
      두 가지 경우 모두 정상적으로 full screen 으로 출력되었고, 댓글로 달아주신 것 같은 증세는 보이지 않았습니다.

      제 개인적인 소견으로는 playView class 내부 코드를 봐야하지 않을까 싶습니다.
      아직 이슈를 해결하지 못하셨다면 playView 코드를 한번 보여주시면 좋을 것 같습니다.

      감사합니다.

      삭제
    4. 아 넵넵 신경써주신거 정말 감사드립니다~
      말씀하신데로 네비게이션바는 잘 가려졌었는데 그만큼의 여백이
      나는 문제는 다름이 아니라 단말기의 세로 사이즈를 계산할때
      이전처럼
      Display display = ((WindowManager)context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
      height = display.getHeight();

      이걸로만 단말기의 전체 세로 사이즈가 구해지지 않아서 생긴
      문제였습니다.
      문제점을 알고 좀더 찾아본 결과

      // 네비게이션바 높이까지 더해서 height 계산하기
      Resources res = this.getResources();
      int resourceId = res.getIdentifier("navigation_bar_height", "dimen", "android");
      if (resourceId > 0) {
      height += res.getDimensionPixelSize(resourceId);}

      그만큼의 높이를 더 구해서 height에 더해야 실제적인 단말기의
      세로 높이가 나온다는걸 알았습니다.
      그래서 이제 여백도 나오지 않구요~~~!!!

      근 이주일을 고민했었는데 어찌해결을 했습니다.
      이렇게 신경써주셨는데 에고 죄송하고 정말 정말 감사드립니다~~
      어떻게 감사드려야할지..
      자주 놀러오고 많이 배우겠습니다 ^_____^

      삭제
    5. 아이고... 늦게 답글을 달아서 죄송합니다;
      문제가 해결되었다니 다행입니다~! 고생하셨어요.

      음... 자주 놀러오셔도 업데이트가 거의 없다보니... 볼 것이 없을지도 모르겠습니다 ㅠ
      제가 조금 더 분발해야겠네요... 하하;

      삭제
다음 이전