android2013. 7. 16. 11:27


저번 글에서는 홈스크린 위젯의 기초에 대해 알아보았으니, 이번 글에서는 홈스크린 위젯에서 상호작용을 할 수 있도록 버튼을 추가해보겠습니다.


지난번에 작업한 예제를 바탕으로 예제를 만들어보겠습니다. 실습을 시작하기 전에 예제를 미리 준비해주세요.

[어플리케이션 정보]

액티비티
  • SimpleActivity.java (SimpleActivity)

레이아웃
  • simpleactivity.xml (SimpleActivity)
  • simple_widget_layout.xml (위젯 레이아웃)

XML
  • simplewidget.xml (위젯 프로바이더)
API Level
  • 8 (Android 2.2)


이번 강좌에서는 위젯에 버튼을 추가하고, 버튼을 누르면 액티비티를 호출하도록 만들어보겠습니다. 먼저 위젯의 레이아웃을 다음과 같이 수정합니다. 버튼이 하나 추가되었습니다.

[simple_widget_layout.xml]
01.<?xml version="1.0" encoding="utf-8"?>
02.<LinearLayout
04.android:background="@drawable/widget_background_4_1"
05.android:gravity="center"
06.android:layout_height="wrap_content"
07.android:layout_width="fill_parent"
08.>
09.<TextView
10.android:layout_width="wrap_content"
11.android:layout_height="wrap_content"
12.android:textColor="#000000"
13.android:textSize="20dp"
14.android:id="@+id/simple_widget_layout_text"
15.android:text="Hello, Widget!" />
16. 
17.<Button
18.android:layout_width="wrap_content"
19.android:layout_height="wrap_content"
20.android:id="@+id/simple_widget_layout_activity"
21.android:layout_marginLeft="10dp"
22.android:text="Activity" />
23. 
24.</LinearLayout>

다음, 위젯 소스코드를 다음과 같이 수정합니다.

[MySimpleWidget.java]
01.public class MySimpleWidget extends AppWidgetProvider {
02. 
03.@Override
04.public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds){
05.final int N = appWidgetIds.length;
06. 
07.for (int i=0; i<N; i++) {
08.int appWidgetId = appWidgetIds[i];
09.RemoteViews views = buildViews(context);
10.appWidgetManager.updateAppWidget(appWidgetId, views);
11.}
12.}
13. 
14.private PendingIntent buildActivityIntent(Context context){
15.Intent intent = new Intent(Intent.ACTION_VIEW)
16..setData(Uri.parse("http://google.com"));
17.PendingIntent pi = PendingIntent.getActivity(context, 0, intent, Intent.FLAG_ACTIVITY_NEW_TASK);
18.return pi;
19.}
20. 
21.private RemoteViews buildViews(Context context){
22.RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.simple_widget_layout);
23.views.setOnClickPendingIntent(R.id.simple_widget_layout_activity, buildActivityIntent(context));
24.return views;
25.}
26.}

버튼을 눌렀을 때 액티비티를 띄우기 위해 buildActivityIntent()에서 PendingIntent를 생성하고, setOnClickPendingIntent()를 통해 버튼을 클릭했을 때 수행할 PendingIntent를 지정합니다. 홈스크린 위젯에서 액티비티를 호출할 때는 액티비티 스택이 없는 상태이므로 Intent.FLAG_ACTIVITY_NEW_TASK 플래그를 지정하여 액티비티가 새로운 태스크에서 실행되도록 지정해야 합니다.

예제를 실행하고, 홈스크린에 위젯을 추가하면 다음과 같이 버튼이 위젯에 버튼이 추가된 모습을 확인하실 수 있습니다.



위젯의 버튼을 누르면 다음과 같이 브라우저가 실행되면서 지정한 페이지가 표시됩니다.




출처 : http://androidhuman.tistory.com/entry/%ED%99%88%EC%8A%A4%ED%81%AC%EB%A6%B0-%EC%9C%84%EC%A0%AF%EC%9D%84-%EB%A7%8C%EB%93%A4%EC%96%B4%EB%B3%B4%EC%9E%90-%EB%B2%84%ED%8A%BC-%EC%B6%94%EA%B0%80%ED%95%98%EA%B8%B0

Posted by 광포한곰돌이
android2013. 7. 16. 11:18

안드로이드에서 연락처 즉, 전화번호부 목록을 가져오는 방법을 알려드리겠습니다.

방법은 Call Log 가져오는 방법과 유사합니다.

AndroidManifest.xml 에 퍼미션 추가

<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<uses-permission android:name="android.permission.READ_CONTACTS" />


PhoneBook.java

    private Cursor getURI() 
    {
        // 주소록 URI        
        Uri people = Contacts.CONTENT_URI;
        
        // 검색할 컬럼 정하기
        String[] projection = new String[] { Contacts._ID, Contacts.DISPLAY_NAME, Contacts.HAS_PHONE_NUMBER };
        
        // 쿼리 날려서 커서 얻기
        String[] selectionArgs = null;
        String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC";    

        // managedquery 는 activity 메소드이므로 아래와 같이 처리함
        return getContentResolver().query(people, projection, null, selectionArgs, sortOrder);
        // return managedQuery(people, projection, null, selectionArgs, sortOrder);
    }

    public void phoneBook() {
        try {
            Cursor cursor = getURI();                    // 전화번호부 가져오기    

            int end = cursor.getCount();                // 전화번호부의 갯수 세기
            Logger.d("ANDROES", "end = "+end);

            String [] name = new String[end];    // 전화번호부의 이름을 저장할 배열 선언
            String [] phone = new String[end];    // 전화번호부의 이름을 저장할 배열 선언
            int count = 0;    

            if(cursor.moveToFirst()) 
            {
                // 컬럼명으로 컬럼 인덱스 찾기 
                int idIndex = cursor.getColumnIndex("_id");

                do 
                {
                    tempItem = new TempItem();
                    
                    // 요소값 얻기
                    int id = cursor.getInt(idIndex);        
                    String phoneChk = cursor.getString(2);
                    if (phoneChk.equals("1")) {
                        Cursor phones = getContentResolver().query(
                                ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                                null,
                                ContactsContract.CommonDataKinds.Phone.CONTACT_ID
                                        + " = " + id, null, null);

                        while (phones.moveToNext()) {
                            phone[count] = phones
                                    .getString(phones
                                            .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                        }        
                    }
                    name[count] = cursor.getString(1);

                    // 개별 연락처 삭제                    
                    // rowNum = getBaseContext().getContentResolver().delete(RawContacts.CONTENT_URI, RawContacts._ID+ " =" + id,null);

                    // LogCat에 로그 남기기
                    // Logger.i("ANDROES", "id=" + id +", name["+count+"]=" + name[count]+", phone["+count+"]=" + phone[count]);
                    count++;
                    
                } while(cursor.moveToNext() || count > end);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


출처 : http://www.androes.com/143

Posted by 광포한곰돌이
android2013. 5. 28. 14:36

1. 키보드 감추기

EditText editText = (EditText) findViewById(R.id.myEdit);
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);

2. 키보드 보여주기
EditText editText = (EditText) findViewById(R.id.myEdit);
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(editText, InputMethodManager.SHOW_FORCED);

위 코드로 안보이는 경우 아래코드도 시도해보세요
- imm.showSoftInputFromInputMethod (editText .getApplicationWindowToken(),InputMethodManager.SHOW_FORCED);

onCreate등에서 제대로 동작하지 않는다면 
Handler로 post를 해서 위 코드를 실행시켜보세요.

3. 키보드 토글 - 위 두가지 방법으로 안되는 경우 다음과 같은 코드로 동작하는 경우가 있습니다.
imm.toggleSoftInputFromWindow(editText.getApplicationWindowToken(),  InputMethodManager.SHOW_FORCED, 0); 

4. 액티비티 시작시 자동으로 키보드 보여주기
AndroidManifest.xml의 activity 태그의 속성에 android:windowSoftInputMode="stateVisible" 혹은 "stateAlwaysVisible"삽입

5. 액티비티 시작시 자동으로 키보드 보여주지 않기
AndroidManifest.xml의 activity 태그의 속성에 android:windowSoftInputMode="stateHidden" 혹은 "stateAlwaysHidden" 삽입

6. 에디트 텍스트 선택해도 키보드 안뜨게 하기
EditText xml 속성에서 inputType 을 0으로 주면 안뜹니다.

 

출처 : http://www.androidpub.com/1104990 

Posted by 광포한곰돌이
android2013. 5. 22. 17:43

픽셀(pixel), 디피(dp) 계산법 입니다. 주로 좌표 계산할 때나 코드상에서 직접 View의 width, height를 사용해야 하는 경우에 유용하게 사용 하실 수 있습니다.


1) dp -> pixel

2) pixel -> dp 


 

 1) pixel = dp * (density / 160) 

 2) 
dp = px * (160 / density)



Posted by 광포한곰돌이
android2013. 5. 22. 17:41

안드로이드에서 모든 해상도에 맞는 개발이 가능한 일 일까요? 정답은 "현실적으로 불가능하다" 입니다. 현재 비공식적으로 안드로이드 단말은 수백, 수천개 이상이 출시 됬거나 출시중에 있다고 합니다. 이렇게 많은 단말들이 출시가 되었지만 저마다 개성있는 부품과 디자인으로 시장에 진출 하고 있습니다. 비슷한 제품도 찾아 보기 힘든 실정이죠. 마찬가지로 해상도와 Density 값도 역시 기기마다 천차만별로 다양화 되고 있고 앞으로도 단말에 따른 파편화는 더 심해 질거라 생각 합니다.


이러한 문제에 대해서 구글은 모든 해상도마다 각각의 레이아웃 작업을 하는 것을 지향하라고 말하고 있지만 현실적으로 그렇게 개발하기란 거의 불가능 하다고 생각 합니다.


그렇기 때문에 타겟 단말을 설정하여 개발 하거나 최대한 모든 단말에 적용 될 수 있게 고려하여 레이아웃 작업을 진행하는게 현실적인 방안 입니다.



[모든 해상도 맞추는 법]

1) 해상도별 폴더를 만들어라.

-> 안드로이드 단말만 수천개 이상, 현실적으로 불가능.

-> 타겟 단말을 지정해서 개발 해라. 


[모든 해상도를 최대한 고려한 작업 방법]

1) match_parent를 잘 활용 하라.

2) weight를 사용하라.

3) RelativeLayout을 사용 하라.

-> align, parent, below, above 등의 속성를 사용하라.

4) dp값을 활용하라.

5) 나인패치를 활용하라.

6) 통이미지라면 큰 이미지를 사용해서 작은 화면에 적용 하라.

7) Scrollview를 잘 활용하라

Posted by 광포한곰돌이
android2013. 4. 5. 16:09

제스처

제스처는 사용자가 제공된 스크린 객체를 조작하여 앱과 상호작용하는 방법입니다. 아래는 안드로이드에서 쓸 수 있는 핵심 제스처 표입니다.


터치





선택한 항목의 기본 기능을 작동합니다.

조작법
눌렀다, 뗍니다


롱 프레스




데이터 선택 모드로 들어갑니다. 하나 이상의 항목을 선택할 수 있고 컨텍스트 액션 바를 통해 데이터를 조작할 수 있습니다. 컨텍스트 메뉴를 보여주기 위해서는 롱 프레스를 쓰지 마세요.

조작법
누르고, 기다렸다, 뗍니다


스와이프




넘친 컨텐츠를 스크롤하거나 같은 계층의 뷰 사이를 이동합니다.

조작법
누르고, 움직이고, 뗍니다
드래그




뷰 내의 데이터를 고쳐 배열하거나 컨테이너로 데이터를 옮깁니다. (예: 홈 화면의 폴더)

조작법
롱 프레스 후, 움직이고, 뗍니다


더블 터치




컨텐츠를 확대합니다. 또 텍스트 선택을 위한 부차 제스처로도 사용합니다.

조작법
짧게 이어 두번 누릅니다


핀치 오픈




컨텐츠를 확대합니다.

조작법
두 손가락으로 누르고, 밖으로 벌리고, 뗍니다

핀치 클로즈




컨텐츠를 축소합니다.

조작법
두 손가락으로 누르고, 안으로 좁히고, 뗍니다

http://fishpoint.tistory.com/747 여기서 퍼옴

Posted by 광포한곰돌이