[컴][안드로이드] actionbar 를 v7 에서 사용하기

Overlay Actionbar 사용하기/ v7-appcompat 사용 설정 방법/


android api v11 부터는 action bar 를 지원하지만 그 이전 버전에서 사용하기 위해서는 v7-appcompat 을 사용해야 한다. IntelliJ 에서 한 번 사용해 보자.


import v7-appcompat

v11 이전 버전에서 ActionBar 를 사용하고자 한다면 ActionBarActivity 를 extends 해서 사용해야 한다. 이것은 jar file 을 build path 에 추가 하는 것만으로도 가능하다. 그런데 여기에 더해 Theme 을 사용해야 하기 때문에 resource 도 함께 library 로 가져와서 사용해야 한다. 그렇기 때문에 import Module 을 해야 한다.

당연히 import Module 을 하기 위해서 필요한 source 들은 가지고 있어야 한다. ref.3 을 참고해서 Android Support Library 를 받아놓아야 한다.

그러면 아래 위치에 놓이기 되는데, 이 녀석을 import 하면 된다.
<sdk_path>\extras\android\support\v7\appcompat


대략적인 절차는 아래와 같다.

  1. Android project 만들기 : ActionBarActivity 를 갖는 project 를 하나 만들자.
  2. import Module : File > Import Module > <sdk_path>\extras\android\support\v7\appcompat
  3. library 추가 : File > Project Structure > Libraries > <sdk_path>\extras\android\support\v7\appcompat\libs > android-support-v7-appcompat > 
  4. Dependency 추가 : File > Project Structure > Module > main_module > Dependecies tab > Add Module dependency >android-support-v7-appcompat


Theme.AppCompat Error


이대로 실행을 하면, onCreate 에서 아래와 같은 에러가 발생한다.

Caused by: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity

Theme.AppCompat 을 사용하지 않아서라고 나오는데, 아래와 같이 Theme 을 지정하면 된다.

<resources>

    <!--
        Base application theme, dependent on API level. This theme is replaced
        by AppBaseTheme from res/values-vXX/styles.xml on newer devices.
    -->
    <style name="AppBaseTheme" parent="Theme.AppCompat">
        <!--
            Theme customizations available in newer API levels can go in
            res/values-vXX/styles.xml, while customizations related to
            backward-compatibility can go here.
        -->
    </style>

    <!-- Application theme. -->
    <style name="AppTheme" parent="AppBaseTheme">
        <item name="windowActionBar">true</item>
        <!-- All customizations that are NOT specific to a particular API-level can go here. -->
        <item name="android:windowActionBarOverlay">true</item>
    </style>

</resources>

여기서 만약
<item name="windowActionBar">true</item>
부분이 없으면 계속 같은 에러가 발생할 것이다.

Caused by: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity


코드에서 검사하는 부분이 있어서 그렇다.
void onCreate(Bundle savedInstanceState) {
    TypedArray a = mActivity.obtainStyledAttributes(R.styleable.ActionBarWindow);

    if (!a.hasValue(R.styleable.ActionBarWindow_windowActionBar)) {
        a.recycle();
        throw new IllegalStateException(
                "You need to use a Theme.AppCompat theme (or descendant) with this activity.");
    }

    mHasActionBar = a.getBoolean(R.styleable.ActionBarWindow_windowActionBar, false);
    mOverlayActionBar = a.getBoolean(R.styleable.ActionBarWindow_windowActionBarOverlay, false);
    a.recycle();
}

참고로
android:windowActionBarOverlay

windowActionBarOverlay
는 다르다는 것을 명심하자. android: 가 package 이름이라는 점에서 본다면, android: 가 붙지 않은 녀석은 우리가 참조를 하는 library, 즉 v7-appcompat 에서 바로 갖다 쓰는 것으로 보면 될 것이다.

주의할 점은 v7 에서는 library 의 녀석을 쓰기 때문에 android: 를 붙이지 않아야 겠지만, 그 이상의 버전에서는 android package 의 녀석을 변경해야 하므로 android: 를 붙여야 한다.

참고에 따르면, 앞에 android 를 붙이는 것은 native action bar 에 사용되는 theme 이고, android 를 붙이지 않은 녀석이 custom theme 에 사용된다고 한다.
참고 : http://actionbarsherlock.com/theming.html


Download Sources

android_intellij.zip
<sdk_path>\extras\android\support\v7\appcompat 의 경로가 달라서 바로 사용할 수는 없을 수 있다. 설정이 어떻게 되어 있는지 정도로의 용도로 활용하면 되겠다.



See Also

  1. ActionBarCompat and I/O 2013 App Source Posted by Chris Banes, Android Developer Relations



References

  1. Adding the Action Bar : http://developer.android.com/guide/topics/ui/actionbar.html#Adding
  2. Overlaying the Action Bar : https://developer.android.com/training/basics/actionbar/overlaying.html
  3. Support Library Setup : http://developer.android.com/tools/support-library/setup.html


댓글 없음:

댓글 쓰기