텍스트 그림자 효과를 넣는 법을 살펴보도록 하겠습니다.

    <style name="TextShadow">

    <item name="android:shadowColor">#000000</item>

    <item name="android:shadowDx">1</item>

    <item name="android:shadowDy">1</item>

    <item name="android:shadowRadius">4</item>

    </style>


우선 shadow를 위한 attribute는 위와 같습니다.
지정할수 있는건, Color/위치 (상대 좌표)/ 범위 정도 입니다.

뭐 딱히 설명 드릴만한게 없군요 ^^

저 같은 경우에는 위처럼 Style을 정의 해서 사용하고 있긴한데,

TextView등의 Attribute로 바로 지정해도 무방합니다. ^^




SVN에 소스 커밋을 할때, 무시해야만 하는 파일이 있다. 

iOS Project 같은 경우, Build 폴더 라던지,
xcodeproj package 내의 개인 설정 ( taehoonkoo.pbxuser ) 등 말이다.

이걸 또, 프로젝트 생성할때마다, svn ps svn:ignore 샬라샬라 해주 것도 여간 귀찮은일인데,
역시나 global-ignore 옵션이 있다. 

$HOME/.subversion/config 에 보면 global-ignore라는 부분이 있는데, 이를 아래와 같이 필요한 규칙을 써주면된다. 



Snow Leopard에는 고맙게도, svn ( client , admin) 과 Apache가 기본설치 되어 있다.

만약 /var/svn/repo 로 svn repository가 있다고 가정하고 Apache로 연동하는법을 살펴 보겠다.

  1 LoadModule dav_svn_module /usr/libexec/apache2/mod_dav_svn.so
  2 
  3 <Location /svn>
  4     DAV svn
  5     SVNParentPath /var/svn/
  6 </Location>

svn.conf 파일을 /etc/apaches2/other 에 생성한한다.

apache를 재시작하면 svn.conf 파일이 알아서 로드 된다.  재시작하는 Command는 아래와 같다. 

sudo /usr/sbin/apachectl restart


http://localhost/svn/repo 로 접속하면 된다 ^^





UILabel의 경우, "setTextAlignment:" 로 Text를 정렬한다. 
UIButton에 setTitle:forControlState:를 통해서 Text를 Setting하면, UIButton의 titleLabel에 값이 설정된다.

그래서
[someButton.titleLabel setTextAlignment:UITextAlignmentLeft]; 했는데, 변함이 없다. 

UIButton의 TitleAlignment는

@property(nonatomic) UIControlContentHorizontalAlignment contentHorizontalAlignment; // how to position content hozontally inside control. default is center


UIControlContentHorizontalAlignment를 통해서 해야한다. 


Android Activity는 Device 상태가 변경되면, Activity ReCreation(onDestroy->onCreate)가 일어 납니다. 
만약에, Activity가 세로로만 보여지길 원하고, 변경이 필요 하지 않다면,

"android:configChanges" property 를 이용하여, 무시하도록 할수 있습니다.

 <activity android:name=".MainActivity"

                  android:configChanges="orientation|keyboardHidden|keyboard"/>


"android:configChanges" property 를 이용하여, 무시하도록 할수 있습니다.
위와 같이 설정을 하게 되면 더이상 Activity ReCreation이 일어 나지 않습니다.

그러나, 위의 같은 경우는 "세로모드로만 동작" 하는 설정이 아닙니다.
Device LandScape인 상태에서 실행하면,  App역시도 LandScape모드로 실행됩니다.

이를 방지 하기 위해서 


 

      <activity android:name=".WakeMeUpMain"

                  android:label="@string/app_name"

                  android:screenOrientation="portrait"

                  android:configChanges="orientation|keyboardHidden|keyboard"/>


android:screenOrientation 속성을 이용하여, portrait로만 보여지게 하면,
"세로모드로만" 보여지는 App 이 됩니다. 

Android Application 은 Activity단위로 움직이기 때문에,
모든 Activity를 세로모드로만 보여줄것이라면, Activity별로 모두 세팅해줘야 합니다. 

AVD 에서 Orientation 바꾸기


Emulator의 메뉴에 봐도, AVD Orientation을 바꾸는게 없다. OTL.

구글링을 해본결과.
"Ctrl + F11", "Ctrl + F12" 로 가능하다 .


구글님들아, 메뉴에 좀 등록해주면 오죽 좋아 ㅎ

TabStrip ?

TabWidget의 Strip(줄) 이미지를 "TabStrip"이라고 한다. 


    android:tabStripEnabled="false"

Default로 "true"로 세팅되어 있고, "false를 주게 되면 하단이 사라지게 된다. 


Android Level 8 API 이기 때문에,  2.1 이하 사용할 수 없는 점을 주의해야 한다. 

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:orientation="vertical"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent">


<Button

android:id="@+id/button"          

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="Button"

>

</Button>

<Button

android:id="@+id/button"          

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="Button"

/>

</LinearLayout>


위와 같이 android:id 가 동일한게 연속적으로 있을 때, 동작할까? 


동작한다 !

 Button button = (Button) findViewById(R.id.button);

        button.setText("First");


위와 같은 Code로 접근하면 어떤 Button의 값이 바뀔까 ? 


그럼 두번쨰 버튼을 접근하려면 ?

<Button

android:id="@+id/button"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="Button"

>

</Button>


<LinearLayout

android:id="@+id/linear"

    android:orientation="vertical"

    android:layout_width="fill_parent"

    android:layout_height="wrap_content">

<Button

android:id="@+id/button"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="Button"

>

</Button>

</LinearLayout>



두번째 Button을 ViewGroup으로 묶어서, " ContentView -> ViewGroup -> 두번째 Button " 으로 묶어서 접근한 것이다. 
findViewsById() 같은 녀석이 있으면 좋을것 같은데, 일단 이렇게 해서 접근 가능합니다.




android:src="@android:drawable/ic_input_delete"


위와 같이 @drawble이 아닌 "@android:drawable"과 같이  접근하면 된다. 

사용가능한 리소스


참조 : http://androiddrawableexplorer.appspot.com/

What is a "Preference Activity" ? 

App. 등 설정에 관련된 UI 구성에 특화 되어 있는 Activity
설정 Item 구성 , Scrolling등을 지원합니다. 

Write XML Layouts

1. Activity Layout 


Class 관계를 살펴보면 PreferenceActivity는 ListActivity를 상속받는다. 
ListActivity에서 ListView를 접근할때,"@android:id/list"로 접근하기 때문에, Layout XML 작성시 유의 해야 한다. 

 <ListView android:id="@android:id/list"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:layout_weight="1"

        android:drawSelectorOnTop="false"/>


2. Preference Items 

addPreferenceFromResource() / addPreferenceFromIntent() 등을 통해 Preference Item을 삽입
나는 addPreferenceFromResource() 를 사용하는 것을 선호한다. 


위와 같이 Preference 관련 resource를 추가 한다. 

<PreferenceScreen

    xmlns:android="http://schemas.android.com/apk/res/android"

    android:title="@string/settings">


    <CheckBoxPreference

        android:key="alarm_in_silent_mode"

        android:title="@string/alarm_in_silent_mode_title"

        android:summary="@string/alarm_in_silent_mode_summary" />


    <VolumePreference

        android:title="@string/alarm_volume_title"

        android:summary="@string/alarm_volume_summary"

        android:dialogTitle="@string/alarm_volume_title"

        android:persistent="false"

        android:streamType="alarm" />


    <ListPreference

        android:key="snooze_duration"

        android:title="@string/snooze_duration_title"

        android:entries="@array/snooze_duration_entries"

        android:entryValues="@array/snooze_duration_values"

        android:defaultValue="10"

        android:dialogTitle="@string/snooze_duration_title" />


    <ListPreference

        android:key="volume_button_setting"

        android:title="@string/volume_button_setting_title"

        android:dialogTitle="@string/volume_button_dialog_title"

        android:entries="@array/volume_button_setting_entries"

        android:entryValues="@array/volume_button_setting_values"

        android:summary="@string/volume_button_setting_summary"

        android:defaultValue="2" />


</PreferenceScreen>


각각의 Entry는 View Entry등과 마찬가지로, Android Class와 Match 된다. 

Write your Code

1. 구현해야 할것들

다른 Activity 사용법과 마찬가지로, 만약 "Setting"화면이 필요하다고 하면,
"PreferenceActivity"를 상속받는 "SettingActivity"를 생성합니다. 

onCreate 
- addPreferenceFromResource를 통해 Preference Item을 구성
onPreferenceTreeClick
- PreferenceClick Event 처리
onPreferenceChanged
- Preference Value Change 처리

2. Source Code

 @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        addPreferencesFromResource(R.xml.settings);

    }



    @Override

    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,

            Preference preference) {

        if (KEY_ALARM_IN_SILENT_MODE.equals(preference.getKey())) {

            CheckBoxPreference pref = (CheckBoxPreference) preference;

            int ringerModeStreamTypes = Settings.System.getInt(

                    getContentResolver(),

                    Settings.System.MODE_RINGER_STREAMS_AFFECTED, 0);


            if (pref.isChecked()) {

                ringerModeStreamTypes &= ~ALARM_STREAM_TYPE_BIT;

            } else {

                ringerModeStreamTypes |= ALARM_STREAM_TYPE_BIT;

            }


            Settings.System.putInt(getContentResolver(),

                    Settings.System.MODE_RINGER_STREAMS_AFFECTED,

                    ringerModeStreamTypes);


            return true;

        }


        return super.onPreferenceTreeClick(preferenceScreen, preference);

    }


    public boolean onPreferenceChange(Preference pref, Object newValue) {

        final ListPreference listPref = (ListPreference) pref;

        final int idx = listPref.findIndexOfValue((String) newValue);

        listPref.setSummary(listPref.getEntries()[idx]);

        return true;

    }


위의 코드는 실제로 addPreferenceFromResource를 통해서, Preference를 구성하고,
onPreferenceTreeClick을 이용하여, Preference Click 이벤트를 처리 하는 부분이다. 

이처럼 PreferenceActivity를 이용하면, 쉽게 Setting 화면을 구성할 수 있다. 


+ Recent posts