본문 바로가기
android

[android] BottomNavigationView 두번째

by 최고집이사 2018. 4. 9.

저번에 이어서 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/SplashActivity.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)

▶ 웹뷰 전화걸기 참고 링크 사이트 : 파퓨표 티스토리.

얻어 온 소스는 안 적으려고 했는데 안 적어 놓으면 이해하기 힘들 터라 그냥 퍼미션 부분만 적어 놓음.

저 중간에 뒤로 두 번 종료 소스 붙혀넣기 하면 됨.

참고로 본인이 위에서 사용한 뒤로 두 번 종료는 아래 링크 참고.


뒤로 두 번 종료 참고 사이트 : CofS`s 블로그 바로가기


화면 깨우기 참고 사이트 : CofS`s 블로그 바로가기

혹시 어디다 사용하는지 모를 경우에 대비 아래 참고


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) {


웹뷰를 사이트 링크가 아닌 파일로 전부 넣어 앱을 만들었는데 업데이트가 너무 불편.

글자 하나 틀려도 다시 앱을 만들어야 하는 불편으로 아예 링크로 만듬.


mWebView.loadUrl("file:///android_asset/index.html");


assets/html/index.html 파일 호출.


웹뷰 참고 사이트 링크 바로가기



이상으로 BottomNavigationView 끝.

이사 해 본 고객만이 감동을 안다. 최고집이사 1666-2498


최고집이사 앱에 사용한 인트로 이미지 1024x600.


최고집이사에 앱에 사용된 png 이미지 이걸로 런처 아이콘 등 사이즈 별로 만듬.