Soft Navigation Bar(LG폰) 처리하기

Posted by ITPangPang
2016. 11. 15. 22:39 안드로이드(android)/알아두면 좋은것


Soft Navigation Bar(LG폰)

처리하기



ㆍ 저는 삼성폰만 써와서 LG폰 만져볼 일이 에뮬레이터 

    빼고 별로 없었는데.. 

    어짜피 SoftNavigation Bar 때문에 한번은 처리해야해서

    친구폰을 잠깐 빌려서 빠르게 처리해버렸습니다..


ㆍ 사실 이 네이게이션바 처리를 어떻게 할까 고민을 많이

    했는데.. layout을 따로 둔 후에 앱 실행시에 체크해서 

    따로따로 뿌려줄까. 아니면 정석대로 처리할까 하다가..

    결국은 그냥 정석대로 처리해버렸습니다..



Soft Navigation Bar는

구글에서 권장하는 부분이라고 합니다.


뭐 최대한 사용자에게

큰화면을 보여주게 하기 위해서겠죠..


아 그리고 Navigation Bar가

LG폰 전용은 아니지만 대다수의 폰이

LG폰이므로 제목에는 그냥 이렇게

적었습니다.


Soft Navigation Bar가 뭐임?



위 그림에서 빨간색

체크박스로 이루어진 부분입니다.


뭐 이렇게 사용할때는

별 문제가 없습니다.


그런데 앱을 하나 실행하면서부터

개발자들이 처리해줘야하는

문제가 생기는 것이죠.


자 이런식으로

해상도별로 쫙 처리를 해서

돌려봤는데 대부분의 LG폰에서는

Soft Navigation Bar 때문에 화면이

가려지는 현상이 나타납니다.


화면구성이 가운데에 집중되어

있는 앱이라면 상관없을 수도 있지만

위와 같이 하단에 사용자의

인풋을 받아야하는 화면이라면

처리를 해줘야겠죠


처리하는 방법은


이렇게 치워버리면 되겠죠!

(또는 layout을 2개 준비해서

앱 실행할때 bar가 있는지 확인후 처리)


그런데 위와 같이

Navigation bar를 치워버리면

사용자는 홈화면도 또는 뒤로가기버튼도

사용할 수 없게됩니다.


앱 내에서 종료를 위한

버튼이 있으면 모를까


그래서! 구글이 완전히

제거해버리는 방법은 불가능하게

만들어놨습니다.


위에서의 화면은

아래와 같습니다.


이렇게 사용자가 하단에서

Swipe(손으로 끌어댕김)를 하면

Navigation Bar가 생기게 됩니다.


어떻게 만드나요?


위 화면은

Immersive 모드입니다


우리말로 바꿔보면

몰입모드겠죠?


위와 다르게 다른앱에서

NavigationBar를 항상 보여주는

앱들이 있는데


그러한 앱들에서도 무언가

동영상이나, 영화같은 화면으로

전환될때는 NavigationBar를 대부분

숨겨둡니다.


영상에 몰입을 하게 하기 위해서겠죠

그래서 Immersive라고 하나 봅니다


코드는 의외로 간단합니다.

public class MainActivity extends AppCompatActivity
{
View v;
int screenMode;

@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
hideSoftNavigationbar();
}

private void hideSoftNavigationbar()
{
v = getWindow().getDecorView();
screenMode = getWindow().getDecorView().getSystemUiVisibility();
if( Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT )
{
screenMode |= View.SYSTEM_UI_FLAG_HIDE_NAVIGATION; //네이게이션 감추자!
screenMode |= View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; // Swipe로 끌어올리기 가능!
}
}

@Override
public void onWindowFocusChanged(boolean hasFocus)
{
if(hasFocus)
{
v.setSystemUiVisibility(screenMode);
}
}
}


이렇게 써주시면 됩니다.


위에서는 2가지만 설정해주었는데

View.SYSTEM_UI_FLAG_LAYOUT_STABLE
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
View.SYSTEM_UI_FLAG_FULLSCREEN
View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;


보통은 이렇게 6가지를

넣습니다.

(뭐 풀모드, 위 상단 status bar까지

가려주는 등등인가 봅니다..)


전 제가 쓰는 앱에서는

2가지만 있으면 되서 2개만

넣어줬습니다.


위에 코드에 나와있듯이

IMMERSIVE_STICKY

킷캣이상에서만 사용 가능합니다.


저는 킷캣이하의 점유율은

조금만 지나면 신경 안써도 될 것 같아서

그 이하는 처리를 안해놨습니다.