저번에 이어서 BottomNavigationView 두번째.
BottomNavigationView 두번째.
Manifest/AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="패키지명">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.CALL_PHONE"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher_round"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".SplashActivity" android:theme="@style/SplashTheme" android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<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="callMyApp" android:host="DamoaApp" />
</intent-filter> //여기까지 삭제해도 됨.
</activity>
<activity android:name=".MainActivity" android:screenOrientation="portrait" android:theme="@style/Theme.AppCompat.NoActionBar"
android:windowSoftInputMode="adjustPan|adjustResize">
</activity>
<service
android:name=".MyFirebaseMessagingService">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT"/>
</intent-filter>
</service>
<service
android:name=".MyFirebaseInstanceIDService">
<intent-filter>
<action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
</intent-filter>
</service>
</application>
</manifest>
▶ CALL_PHONE 은 웹뷰에서 전화번호 링크(tel:16662498)나 sms, mailto 등을 위한 퍼미션.
▶ android:windowSoftInputMode="adjustPan|adjustResize : 메뉴바가 키보드 위로 붙는 걸 방지.
이걸 안하면 키보드 위로 메뉴바가 따라 올라가며 붙어 있는다.
▶ android:theme="@style/Theme.AppCompat.NoActionBar" 이 부분 삭제하면 상단 타이틀이 보인다.
java/BottomNavigationViewHelper.java
메뉴 바의 아이템 수가 3개 이상일 때 실행되는 아이템 애니모션 방지.
링크 참고 : BottomNavigationViewHelper 바로가기
위 이미지 부분 그대로 사용하면 된다.
java/MyFirebaseMessagingService.java
java/MyFirebaseInstanceIDService.java
아주 많은 리뷰들이 있으니 참조해서 사용.
뒤로 두 번 눌러 종료하기
java/MainActivity.java
@SuppressLint("SetJavaScriptEnabled")
public class MainActivity extends AppCompatActivity implements BottomNavigationView.OnNavigationItemSelectedListener{
BottomNavigationView bottomNavigationView;
WebView mWebView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/*//화면 깨우기기 사용 시 주석 풀고 사용.
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
| WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
| WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
| WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); */
//뒤로 버튼 추가 위 링크 사용이 더 간편. 이 부분 삭제 후 붙혀넣기 하면 됨.
backPressCloseHandler = new BackPressCloseHandler(this);
//FCM 메세지 추가
FirebaseMessaging.getInstance().subscribeToTopic("news");
FirebaseInstanceId.getInstance().getToken();
bottomNavigationView = (BottomNavigationView) findViewById(R.id.bottomNavigation);
//보텀네비뷰 헬퍼 아이콘 애니 스톱
BottomNavigationViewHelper.disableShiftMode(bottomNavigationView);
mWebView = (WebView) findViewById(R.id.activity_main_webview);
//웹 뷰 세팅
WebSettings webSettings = mWebView.getSettings(); //세부 세팅
mWebView.getSettings().setJavaScriptEnabled(true); //자바 허용
//mWebView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
mWebView.setWebChromeClient(new WebChromeClient()); //dialog 실행
//mWebView.setWebViewClient(new WebViewClient()); //새창 막기
mWebView.setWebViewClient(new MyWC()); //아래 전화링크(tel:) 세팅 추가분
mWebView.setVerticalScrollBarEnabled(false); //스크롤 제거
mWebView.setHorizontalScrollBarEnabled(false); //스크롤 제거
mWebView.getSettings().setBuiltInZoomControls(true); //줌 컨트롤
mWebView.getSettings().setDisplayZoomControls(false); //줌 도구 없애기
//mWebView.getSettings().setSupportZoom(false); //줌
mWebView.getSettings().setLoadsImagesAutomatically(true); //이미지 로드
//mWebView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE); //캐시모드 네트워크로
//mWebView.getSettings().setUserAgentString("app"); //
//mWebView.getSettings().setAllowFileAccess(true); //파일 액세스
bottomNavigationView.setOnNavigationItemSelectedListener(this);
//첫 화면 추가
mWebView.loadUrl("사이트 주소");
//퍼미션 권한 허가 받기
PermissionListener permissionlistener = new PermissionListener() {
@Override
public void onPermissionGranted() {
Toast.makeText(MainActivity.this, "권한 허가", Toast.LENGTH_SHORT).show();
}
@Override
public void onPermissionDenied(ArrayList<String> deniedPermissions) {
Toast.makeText(MainActivity.this, "권한 거부\n" + deniedPermissions.toString(), Toast.LENGTH_SHORT)
.show();
}
};
TedPermission.with(this)
.setPermissionListener(permissionlistener)
.setDeniedTitle("권한 거부")
.setRationaleMessage("원활한 상담을 위해 전화걸기 권한이 필요합니다.")
.setDeniedMessage(
"권한을 거부하면 일부 서비스를 이용하실 수 없습니다\n\n설정에서 권한을 허용해 주세요. [설정] > [권한]")
//.setGotoSettingButtonText("bla bla")
.setPermissions(android.Manifest.permission.CALL_PHONE)
.check();
//권한 받기 끝
}
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
int id= item.getItemId();
switch (id) {
case R.id.home_id:
mWebView.loadUrl("사이트 주소"); //home 순서상관 없음.
break;
case R.id.talk_id:
mWebView.loadUrl("사이트 주소"); //talk
break;
case R.id.write_id:
mWebView.loadUrl("사이트 주소"); //write
break;
case R.id.mate_id:
mWebView.loadUrl("사이트 주소"); //mate
break;
case R.id.login_id:
mWebView.loadUrl("사이트 주소"); //login
break;
}
return true;
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
if (mWebView.canGoBack()) {
mWebView.goBack();
return false;
}
}
return super.onKeyDown(keyCode, event);
}
private BackPressCloseHandler backPressCloseHandler;
@Override
public void onBackPressed() {
//super.onBackPressed();
backPressCloseHandler.onBackPressed();
}
/*
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
*/
//tel 링크 전화걸기 퍼미션과 함께 추가 분
private class MyWC extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if( url.startsWith("http://"))
return false;
else {
boolean override = false;
Intent intent = new Intent( Intent.ACTION_VIEW, Uri.parse(url));
intent.addCategory(Intent.CATEGORY_APP_BROWSER); //CATEGORY_BROWSER 면 브라우저 선택창 뜸
intent.putExtra(Browser.EXTRA_APPLICATION_ID, getPackageName());
........
전화걸기 사이트 방문해서 여기다 나머지 붙혀넣기 하면 됨.
}
return super.shouldOverrideUrlLoading(view, url);
}
}
}
▶ 퍼미션 권한 받기 사이트 링크 바로가기 : 박상권의 삽질 블로그.
퍼미션 추가하는 방법: 아래처럼 빨간 글씨 부분에 권한 이름 추가)
.setPermissions(android.Manifest.permission.CALL_PHONE,android.Manifest.permission.READ_PHONE_STATE)
▶ 웹뷰 전화걸기 참고 링크 사이트 : 파퓨표 티스토리.
얻어 온 소스는 안 적으려고 했는데 안 적어 놓으면 이해하기 힘들 터라 그냥 퍼미션 부분만 적어 놓음.
저 중간에 뒤로 두 번 종료 소스 붙혀넣기 하면 됨.
참고로 본인이 위에서 사용한 뒤로 두 번 종료는 아래 링크 참고.
java/MyFirebaseMessagingService - 화면 깨우기
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
if (remoteMessage.getData().size() > 0) {
sendNotification(remoteMessage.getData().get("message"));
}
if (remoteMessage.getNotification() != null) {
sendNotification(remoteMessage.getNotification().getBody());
}
//화면 깨우기
PowerManager.WakeLock sCpuWakeLock = null;
..... 위 링크 사이트의 소스를 이곳에 붙혀 넣기 하면 됨.
private void sendNotification(String messageBody) {
웹뷰를 사이트 링크가 아닌 파일로 전부 넣어 앱을 만들었는데 업데이트가 너무 불편.
글자 하나 틀려도 다시 앱을 만들어야 하는 불편으로 아예 링크로 만듬.
이상으로 BottomNavigationView 끝.
이사 해 본 고객만이 감동을 안다. 최고집이사 1666-2498
최고집이사 앱에 사용한 인트로 이미지 1024x600.
최고집이사에 앱에 사용된 png 이미지 이걸로 런처 아이콘 등 사이즈 별로 만듬.
'android' 카테고리의 다른 글
영화진흥위원회 오픈 API (0) | 2018.07.02 |
---|---|
[android] BottomNavigationView 첫번째 (0) | 2018.04.09 |
안드로이드 스튜디오 bottom navigation & WebView - 세번째 (0) | 2018.03.09 |
안드로이드 스튜디오 bottom navigation & WebView - 두번째 (0) | 2018.03.08 |
안드로이드 스튜디오 bottom navigation & WebView - 첫번째 (0) | 2018.03.05 |