안녕하세요. IT 김군입니다.

제 블로그 메모장에 근 1년반만에 글을 적는 것 같네요...

이번에 또 오랜만에 Android 개발 파트를 맡아 진행하게 되다보니 예전에 했던 내용들을 적어놓지 않아

하나도 기억이 안나더군요....

 

그래서 이제는 열심히 적어볼까 합니다.

우선 오랜만에 Android로 돌아오다보니 Google의 공식 지원언어가 Kotlin으로 채택되었더라구요.

하지만 저에게 긴 러닝커브가 주어지지 않아 그나마 조금이라도 봤던 Java로 진행합니다.

저도 Java나 Android에 대한 깊은 지식이 있는게 아니기때문에 잘못된 부분 있으면 댓글 부탁드립니다.

 

서론이 길었네요.

오늘은 Custom ActionBar 만든 후 좌우에 생기는 공백을 지우는 방법을 적어보겠습니다.

 

1. Custom Actionbar 관련한 파일을 생성해줍니다.

 

1-1.\customVeiw\CustomActionBar.java 생성

(저의 경우는 그냥 제가 편해서 폴더 구분한거라 굳이 안하셔도 상관없습니다.)

 

1-2. \layout\custom_actionbar.xml 생성

 

1-3. logo.png

(Custom ActionBar에 넣을 Image를 대충 하나 준비하였습니다.)

 

 

 

이제 가장 먼저 \layout\custom_actionbar.xml 의 소스를 먼저 살펴보겠습니다.


#### custom_actionbar.xml ####

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent" android:layout_height="match_parent"
    android:gravity="center_vertical"
    android:background="#000000">

    <ImageView
        android:id="@+id/iv_logo"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:srcCompat="@drawable/logo"
        android:layout_gravity="center_vertical|center_horizontal"
        android:layout_marginTop="5dp"
        android:layout_marginBottom="5dp"
        />
</LinearLayout>

 

custom_actionbar.xml 에서는 LinearLayout을 사용했습니다. (제가 LinearLayout 찬양이라........)

여기서는 사실 큰 작업을 한 건 없습니다.

그냥 background 색상을 지정해주고 layout을 모두 센터로 지정해주었습니다.

 

 

다음은 \customView\CustomActionBar.java 의 소스를 살펴보겠습니다.


#### CustomActionBar.java ####

package com.itkim.exam.customactionbar.customView;

import android.app.Activity;
import android.view.LayoutInflater;
import android.view.View;
import com.itkim.exam.customactionbar.R;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.widget.Toolbar;

public class CustomActionBar {

    private Activity activity;
    private ActionBar actionBar;

    public CustomActionBar(Activity _activity, ActionBar _actionBar){
        this.activity = _activity;
        this.actionBar = _actionBar;
    }

    public void setActionBar(){
        actionBar.setDisplayShowCustomEnabled(true);
        actionBar.setDisplayHomeAsUpEnabled(false);
        actionBar.setDisplayShowTitleEnabled(false);
        actionBar.setDisplayShowHomeEnabled(false);

        View mCustomView = LayoutInflater.from(activity)
        					.inflate(R.layout.custom_actionbar, null);
        actionBar.setCustomView(mCustomView);
    }
}

 

CustomActionBar.java를 살펴보면 우선

1. ActionBar를 Custom해서 사용할 Activity에 대한 정보를 생성자에서 파라미터로 받아 초기화해줍니다.

2. setActionBar Function을 통해 기존 ActionBar들은 보이지 않게 설정해주고 Custom ActionBar를 등록하여 줍니다.

 

 

 

다음은 MainActivity.java를 살펴보도록 하겠습니다.


#### MainActivity.java ####

package com.itkim.exam.customactionbar.activity;

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import com.itkim.exam.customactionbar.R;
import com.itkim.exam.customactionbar.customView.CustomActionBar;

public class MainActivity extends AppCompatActivity {

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

        setActionBar();
    }

    private void setActionBar(){
        // 커스텀 액션바 적용
        CustomActionBar ca = new CustomActionBar(this, getSupportActionBar());
        ca.setActionBar();
    }
}

MainActivity.java에서도 특별한건 없습니다.

그냥 아까 만들었던 CustomActionBar의 객체를 생성해주었고 Activity와 현재의 Actionbar정보를 넘겨주었습니다.

 

여기까지 진행하시면 짠! Custom ActionBar가 적용됩니다.

 

음....... 회사에서 했을 때는 아래 사진과 같이 공백이 생겼는데 집에서 포스팅하면서 해보니 왜 잘되는지 모르겠군요......

 

우선 아래 사진 보겠습니다.

 

 

분명 회사에서 했을 때는 저기 빨간 박스 부분에 공백이 생겼는데요....

 

일단 생겼다는 가정하에 진행해보도록 하겠습니다.

 

저기에 공백이 생기면 아까 작성했던 CustomActionBar.java에 4줄만 추가해주시면 됩니다.

 


#### CustomActionBar.java ####

package com.itkim.exam.customactionbar.customView;

import android.app.Activity;
import android.view.LayoutInflater;
import android.view.View;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import com.itkim.exam.customactionbar.R;

public class Custom_ActionBar extends AppCompatActivity {

    private Activity activity;
    private ActionBar actionBar;

    public Custom_ActionBar(Activity _activity, ActionBar _actionBar){
        this.activity = _activity;
        this.actionBar = _actionBar;
    }

    public void setActionBar(){
        actionBar.setDisplayShowCustomEnabled(true);
        actionBar.setDisplayHomeAsUpEnabled(false);
        actionBar.setDisplayShowTitleEnabled(false);
        actionBar.setDisplayShowHomeEnabled(false);

        View mCustomView = LayoutInflater.from(activity).inflate(R.layout.custom_actionbar, null);
        actionBar.setCustomView(mCustomView);

        // Custom ActionBar 생성하면 양쪽에 공백이 생기는데 이 공백을 채우기 위해 아래 4줄 적용
        Toolbar parent = (Toolbar)mCustomView.getParent();
        parent.setContentInsetsAbsolute(0,0);
        ActionBar.LayoutParams params = new ActionBar.LayoutParams(ActionBar.LayoutParams.MATCH_PARENT, ActionBar.LayoutParams.MATCH_PARENT);
        actionBar.setCustomView(mCustomView, params);
    }
}

 

위 주석에 있는 것처럼 아래 4줄만 추가해주시면 정상적으로 작동합니다.

 

 


// Custom ActionBar 생성하면 양쪽에 공백이 생기는데 이 공백을 채우기 위해 아래 4줄 적용
        Toolbar parent = (Toolbar)mCustomView.getParent();
        parent.setContentInsetsAbsolute(0,0);
        ActionBar.LayoutParams params = new ActionBar.LayoutParams(ActionBar.LayoutParams.MATCH_PARENT, ActionBar.LayoutParams.MATCH_PARENT);
        actionBar.setCustomView(mCustomView, params);

 

여기까지 끝!

 

도움이 되셨다면 공감버튼 한 번만 부탁드리겠습니다.

 

저도 Android / Java에 대한 지식이 많이 부족하기에 잘못된 부분이 있다면 댓글로 꼭 알려주세요.

 

감사합니다.

 


WRITTEN BY
IT김군
S/W 개발자 김군의 메모장

트랙백  0 , 댓글  7개가 달렸습니다.
  1. MainActivity.java에서 getSupportActionBar()를 넣으면 빨간줄이 생깁니다.
  2. 댓글 달아 주신거 보고

    import androidx.appcompat.app.ActionBar; 로 바꾸고
    CustomActionBar.java에서
    public CustomActionBar(Activity activity, ActionBar actionBar){
    this.activity = activity;
    this.actionBar = actionBar;
    }

    public CustomActionBar(MainActivity activity, androidx.appcompat.app.ActionBar supportActionBar) { // 일단 잘 안됨
    this.activity = activity;
    this.actionBar = supportActionBar;
    }
    하니까 빨간줄은 없는데 막상 실행하려니까
    앱이 바로꺼지면서 아래와 같이 에러 로그가 찍히네요

    2020-03-11 13:29:09.053 1773-2454/? E/GnssHAL_GnssInterface: gnssSvStatusCb: a: input svInfo.flags is 8
    2020-03-11 13:29:09.053 1773-2454/? E/GnssHAL_GnssInterface: gnssSvStatusCb: b: input svInfo.flags is 8
    2020-03-11 13:29:09.098 10153-10183/? I/MicroDetectionWorker: #startMicroDetector [speakerMode: 0]
    2020-03-11 13:29:09.100 10153-10183/? W/ErrorReporter: reportError [type: 211, code: 393244, bug: 0]: errorCode: 393244, engine: 0
    2020-03-11 13:29:09.102 10153-10183/? I/MicroDetector: Keeping mic open: false
    2020-03-11 13:29:09.103 10153-10183/? I/MicroDetectionWorker: #onError(false)
  3. 아 월요일부터 시작된 고통을 끝내게 해주셨습니다. 정말 감사합니다.
  4. 학생 123 2020.06.19 23:37
    ActionBar bar = getSupportActionBar();
    이렇게 사용하였을때 이 한줄이 전체적으로 빨간줄이 뜹니다
    import androidx.appcompat.app.AppCompatActivity;
    되어있습니다

    마우스를 가져다대면 이렇게 뜹니다
    incompatible types.
    Requlred: android.app.ActionBar
    Found: androidx.appcompat.app.ActionBar

    Change varlable 'bar' type to 'androidxappcompat.app.ActionBar' Alt+Shift + Enter
    More actions... Alt + Enter
secret