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
대략적인 절차는 아래와 같다.
- Android project 만들기 : ActionBarActivity 를 갖는 project 를 하나 만들자.
- import Module : File > Import Module > <sdk_path>\extras\android\support\v7\appcompat
- library 추가 : File > Project Structure > Libraries > <sdk_path>\extras\android\support\v7\appcompat\libs > android-support-v7-appcompat >
- 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
<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
References
- Adding the Action Bar : http://developer.android.com/guide/topics/ui/actionbar.html#Adding
- Overlaying the Action Bar : https://developer.android.com/training/basics/actionbar/overlaying.html
- Support Library Setup : http://developer.android.com/tools/support-library/setup.html
댓글 없음:
댓글 쓰기