[DRM] 마켓별 DRM 적용방법.





1. DRM 적용 스토어 리스트.

1. 구글 스토어 

2. 티스토어 

3. 삼성앱스

4. 올레마켓


2. 적용방법 


# 각 스토어 별로 DRM 적용 방법은 , 각 스토어 별로 안내 지침 보셔야 합니다.


   제가 하나하나 알려 드리면 좋지만, 

   - 스토어 별로 DRM이 주기적으로 업데이트 되며, ( DRM 라이브러리의 버전이 맞지 않다면, 리젝됩니다. ), 주기적으로 소스도 바뀝니다.

   - 파일 하나로 끝나는 것이 아니라, java 파일, manifest파일, proguard관련 설정 까지 경우에 따라서 맞추어야 합니다.

  그래서, 스토어 안내사항 보시는 것이 최고입니다. 


# 스토어별 링크 


1. 구글 스토어 

- 추가적 DRM 필요 없습니다. 


2. 티스토어 

 - http://dev.tstore.co.kr/devpoc/download/downloadApplicationDRM.omp?ctgrCd=applicationDRM&menuId=1


3. 삼성앱스 

 - http://developer.samsung.com/android ( 요기 들어가서 열심히 검색. )


4. 올레마켓 

- https://seller.ollehmarket.com/page/cs_devpds_front/devpds_view_list.jsp?selectnid=51200011123208&pagesize=5&pagecount=10&pagecurrent=1&pagestart=1


# 해당 마켓에 자세히 설명이 나와있으니, 안내사항대로 순차적으로 적용하시면 어려운 점 없으실 겁니다.



신고
크리에이티브 커먼즈 라이선스
Creative Commons License

안드로이드 개발자 간담회 후기 ( 2 )




안드로이드 개발자 간담회 각 세션에 대한 상세 설명을 기록해 보자. ^^ 

감상평은 요기. 

2012/09/18 - [Programming/android] - 안드로이드 개발자 간담회 후기 ( 1 )

앞쪽에서는, 열심히 적었는데.. 뒤로 갈수록 졸음이 밀려와서 약간은 기록이 허술하다. ㅜ_ㅜ


사진 출처는 : 권순선 님의 구글 플러스 


모든 세션은 영어로만 진행되고, 통역지원조차 되지 않아 불가피하게 영어로 필기. 

뭐 통역하면서 필기하는 것이 더 어려우니까.. 휴..

흠... 몇가지만 한글로 살짝 통역하고... 나머지는 뭐 패스. ^^;;


아, 발표 내용중에 VSync라는 내용에 대하여, 조금은 길게 설명했는데...

이는 잘 모르겠는 내용. 공부가 필요하다.


1st. Definitive Android Design ( 결정적인 안드로이드 디자인 ? ) 


- Density independent pixels


  Allows developers to build flexible UIs

  > 유연한 UI를 만들어라.


  ldpi / mdpi / hdpi / xhdpi

  > density 에 따라서, 위의 리소스 타입을 모두 구현하라.


- Bitmap assets


  Build assets for each density

  ldpi, mdpi, hdpi, xhdpi


  scale up ( interpolation)

  scale down (aliasing)


  > Bitmap asset을 사용할때도, density 에 따라서, 위의 리소스 타입을 모두 구현하라.

     자체적으로 , scale up <-> scale down을 하긴 하지만, 이것이 이미지의 품질을 보장하지는 않는다.


- Tablet 


  >= Android 3.2, Smallest width 600dp(sw600dp)layout-sw600dp

  < Android 3.2, large or xlarge layouts - layout-large , layout-xlarge


  - 48dp height = ~9mm

  Touchscreen objects should be 7-10mm


  > 터치영역은 최소 48dp height는 되어야 한다. 사용자에게 터치 실수를 하게 하면 안된다.

- Mind the Gap 

Leave space for borders


- Gap 


  > 사용자가 잘못 터치하는 것을 미연에 방지하기 위하여...

  padding 16dip정도… 주어야 한다. 컨텐츠 크기를 넓히기 위해서 Gap을 좁게 하면 안된다.


- Action Bar 

  > 액션바에는 다음 4가지가 있다.


   1. App icon - 이동을 도와주기도 한다.

   2. View control

   3. Action buttons

   4. Action overflow - 휴대 기기의 한정된 공간을 이용하기 위하여….


- Rotation & different screen sizes


  > 상태에 따라 한가지 어플리케이션도 다르게 화면 구성을 해야 한다.


- Notification


- Base Layout (?)


  Not changed in Jelly Bean

  > 잘 모르겠다. 공부 하자.


-Expanded layout (?)

  > 잘 모르겠다. 공부 하자.


-Actions (?)


   Handle most common tasks

   Streamline trianging

   Do not abuse it

  > 잘 모르겠다. 공부 하자.

   

* App Structure


- General structure


   - Top level views - Put content forward


- Up vs back


   Up and back is different


- Navigation controls


- Fragments 


   Reusable UI components

      Can be used as non-UI data objects


   Organise layouts in sections

      Each section is a fragment


   Display multiple fragments on tablets

      One or two on phones


 - Swipeable pages

   

   ViewPager class

      PagerAdapter - swipe able views


- Support Library


   1.6 +


- Pure Android 

  > 안드로이드를 안드로이드 답게 개발하자.


  Don'ts 

     Mimic UI from other platforms

     > 다른 플랫폼을 흉내내어 디자인 하지 말자.

     Carry over platform-specific icons

     Use bottom tab bars 

     > 안드로이드 탭은 위.. 아이폰은 아래…

        안드로이드의 백키 및 메뉴키가 같이 눌릴 수 있으므로... 위에 놓는 것이 좋다.

     Use labeled back buttons

     Use right-point caret buttons ">"표시!

     > 이 또한 아이폰을 흉내내지 말라.


 Do's 

     Use Action bar

     Build intelligent context-aware apps

     Pre-load data at appropriate times

     Focus on the user experience

     Provide offline support

     > 모든 사용자들이 네트워크게 연결되어 있다고 생각하지 말고, 오프라인일때도 사용할 수 있게 하라.


2st. What's new in Android.


* Project Butter


- UI Goals

  - Smooth

  - Responsive


- Jank

  - Missed frames

  - Repeated frames

  - Resulting in jittery animation


- VSync ( Before JellyBean.!? )


  - Displays draw at 60 fps

  - VSync is a control signal

    - For each frame


- Drawing without VSync

- Drawing with VSync


- Double Buffering

- Triple Buffering


* Rich Notifications


* SDK Tools


- New tools

    - Lint

    - Device Monitor

    - System Trace


- Rapid development

    - Improved visual layout editor

    - App template


* Building Android App with Wep API's.


* Google Play


발표자 : Tony Chan , Ankur Kotwal


* 추가 질문 : 구글 플러스와 같은… 홈버튼을 누르면 나오는 슬라이드 드로워 같은… 것은 공개 여부가 있는가?

하고 있다. 공개 예정이다.


3st. In App Billling

  - 인앱 빌링은... 필기까지는 안했다. 

    여튼, 발표자분 귀여우셨다는... 


4st. How to get featured


1. What are we looking for?

  - Always think about the user!


2. Greate looking App Page


- 멋진 아이콘

- 멋진 포트터 사진

- 내용이 좋은… 어플리케이션 설명.

- Video를 넣어도 좋다!


3. Think "Pure Android"


 - Don't use bottom tab navigation bars. 

     ( 터치가 겹칠 수 있다. )

 - Be mindful about back button navigation. 


4. Other things we look for


- Apps over 1MB should allow users to "Move to SD card"

- User ratings ( > 4.0 )

- Not everyone in the world has great mobile networks -> Think about your offline experience.


저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

안드로이드 단말별 해상도 정보



(단위 : 픽셀)

범주기기명가로세로가로비세로비
Apple아이패드7681024

1

1.3

아이폰4G640960

1

1.5

아이폰3G320460

1

1.4375

HVGAG1, 옵티머스1, 이자르 등320480

1

1.5

WVGA 800넥서스원, 갤럭시S, 갤럭시S2, 디자이어 등480800

1

1.66

WVGA 854모토로라, 드로이드, XPeria, X10 등480854

1

1.77

7인치 태블릿킨들파이어, 누크태블릿, 갤럭시탭 7인치6001024

1

1.7

10인치 태블릿갤럭시탭 10.1, Asus transformer8001280

1

1.6

10인치 태블릿2모토로라 XOOM7201280

1

1.77

-갤럭시 S2 LTE, 갤럭시 S37201280

1

1.77

갤럭시 노트8001280

1

1.6

갤럭시 넥서스7201280

1

1.77


잘못 기재된 내용이 있다면, 덧글 부탁드립니다.

신고
크리에이티브 커먼즈 라이선스
Creative Commons License

안드로이드 문자 보내기 (2)




안드로이드 문자 어플리케이션을 통해서 보내는 방법은 다음과 같다.

# MIME type을 이용 ("vnd.android-dir/mms-sms")

# 이렇게 하면, 실행됨.

 private void sendSmsByApplication(){
     Intent i = new Intent(Intent.ACTION_VIEW);
     i.putExtra("address", "01025481781");
     i.putExtra("sms_body", "Hello my friends!");
     i.setType("vnd.android-dir/mms-sms");
     startActivity(i);
 }


하지만, 갤럭시 탭에서는 에러가 발생한다. 

실행할 문자 어플리케이션이 없어서 그렇다. 이런 경우, Exception발생.
다음과 같은 Exception. 이런 경우도 대비해야겠다. 

12-28 12:46:17.520: E/AndroidRuntime(1637): FATAL EXCEPTION: main
12-28 12:46:17.520: E/AndroidRuntime(1637): android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW typ=vnd.android-dir/mms-sms (has extras) }
12-28 12:46:17.520: E/AndroidRuntime(1637):  at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1510)
12-28 12:46:17.520: E/AndroidRuntime(1637):  at android.app.Instrumentation.execStartActivity(Instrumentation.java:1384)
12-28 12:46:17.520: E/AndroidRuntime(1637):  at android.app.Activity.startActivityForResult(Activity.java:3131)
12-28 12:46:17.520: E/AndroidRuntime(1637):  at android.app.Activity.startActivity(Activity.java:3237)
12-28 12:46:17.520: E/AndroidRuntime(1637):  at s.m.s.MainActivity.sendSmsByApplication(MainActivity.java:40)
12-28 12:46:17.520: E/AndroidRuntime(1637):  at s.m.s.MainActivity.access$0(MainActivity.java:35)
12-28 12:46:17.520: E/AndroidRuntime(1637):  at s.m.s.MainActivity$1.onClick(MainActivity.java:30)
12-28 12:46:17.520: E/AndroidRuntime(1637):  at android.view.View.performClick(View.java:3122)
12-28 12:46:17.520: E/AndroidRuntime(1637):  at android.view.View$PerformClick.run(View.java:12020)
12-28 12:46:17.520: E/AndroidRuntime(1637):  at android.os.Handler.handleCallback(Handler.java:587)
12-28 12:46:17.520: E/AndroidRuntime(1637):  at android.os.Handler.dispatchMessage(Handler.java:92)
12-28 12:46:17.520: E/AndroidRuntime(1637):  at android.os.Looper.loop(Looper.java:132)
12-28 12:46:17.520: E/AndroidRuntime(1637):  at android.app.ActivityThread.main(ActivityThread.java:4126)
12-28 12:46:17.520: E/AndroidRuntime(1637):  at java.lang.reflect.Method.invokeNative(Native Method)
12-28 12:46:17.520: E/AndroidRuntime(1637):  at java.lang.reflect.Method.invoke(Method.java:491)
12-28 12:46:17.520: E/AndroidRuntime(1637):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844)
12-28 12:46:17.520: E/AndroidRuntime(1637):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
12-28 12:46:17.520: E/AndroidRuntime(1637):  at dalvik.system.NativeStart.main(Native Method) 


신고
크리에이티브 커먼즈 라이선스
Creative Commons License

안드로이드 문자보내기 (1)




문자를 보내는 방법은, 다음과 같다.

1. AndroidManifest.xml 파일에 퍼미션을 추가한다.

<uses-permission android:name="android.permission.SEND_SMS" />        
<uses-permission android:name="android.permission.RECEIVE_SMS" />        


2. 자바 코드에 코드를 추가한다.
전화기능이 없는 갤탭 10인치에서는 NoService가 옴. 

public class MainActivity extends Activity {
private Button btnSendSMS; 
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        findViewById(R.id.btnSendSMS).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sendSMS("01012345678", "Send, sms, please.!");
}
});
    }
    
    /**
     * 문자를 보내는 메소드
     * @param phoneNumber
     * @param message
     */
    private void sendSMS(String phoneNumber, String message){
    
     String SENT = "SMS_SENT";
     String DELIVERED = "SMS_DELIVERED";
     
 
       // 문자 보내는 상태를 감지하는 PendingIntent
     PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, new Intent(SENT), 0);
        // 문자 받은 상태를 감지하는 PendingIntent
     PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0, new Intent(DELIVERED), 0);
       
 
       // 문자 보내는 상태를 감지하는 BroadcastReceiver를 등록한다.
     registerReceiver(new BroadcastReceiver() {

                       // 문자를 수신하면, 발생. 

@Override
public void onReceive(Context context, Intent intent) {
switch (getResultCode()) {
case Activity.RESULT_OK:
Toast.makeText(getBaseContext(), "SMS sent", Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
Toast.makeText(getBaseContext(), "Generic failure", Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_NO_SERVICE:
Toast.makeText(getBaseContext(), "No service", Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_NULL_PDU:
Toast.makeText(getBaseContext(), "Null PDU", Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_RADIO_OFF:
Toast.makeText(getBaseContext(), "Radio off", Toast.LENGTH_SHORT).show();
break;
}
}
}, new IntentFilter(SENT));
    
     // 문자를 받는 상태를 확인하는 BroadcastReceiver를 등록.
     registerReceiver(new BroadcastReceiver() {

                        // 문자를 받게 되면, 불린다. 
@Override
public void onReceive(Context context, Intent intent) {
switch (getResultCode()) {
case Activity.RESULT_OK:
Toast.makeText(getBaseContext(), "SMS delivered", Toast.LENGTH_SHORT).show();
break;
case Activity.RESULT_CANCELED:
Toast.makeText(getBaseContext(), "SMS not delivered", Toast.LENGTH_SHORT).show();
break;
}
}
}, new IntentFilter(DELIVERED));
     
 
       // SmsManager를 가져온다.
     SmsManager sms = SmsManager.getDefault();
        // sms를 보낸다. 
     sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI);
    
    }
}


※ 문자를 보내는 메소드 설명.
 

sms.sendTextMessage(String destinationAddress, scAddress, Stringn text, PendingIntent sendIntent, deliveryIntent);

destinationAddress, phoneNumber,
scAddress - Service center address, use null for default SMSC
text - SMS message
sendIntent - pending intent to invoke when the message is sent
deliveryIntent - pending intent to invoke when the message has been delivered.

만약, 문자를 수신하는상태 및 보낸 상태를 파악하고 싶지 않으면, sendIntent, deliveryIntent를 null로 주면 된다.

※ 문자를 보내는 기능이 없는 갤럭시 탭 와이파이 버전같은 경우, 

SmsManager.RESULT_ERROR_NO_SERVICE:  콜백이 onReceive에서 온다.

관련글.
2011/12/30 - [Programming/android] - 안드로이드 문자 보내기 (2)

신고
크리에이티브 커먼즈 라이선스
Creative Commons License

ActionBar에 메뉴 넣기.




액션바에 메뉴를 넣는 방법은 , 

1.  Activity의  
     public boolean onCreateOptionsMenu(Menu menu)  메소드를 오버라이드 한다.
     메뉴를 넣을려면 이 메소드를 오버라이드 한다.

2. Activity의    
     public boolean onOptionsItemSelected(MenuItem item) 메소드를 오버라이드한다.
     메뉴가 나오고, 메뉴가 선택되면 호출된다.

예제

public class ActionBarExample01Activity extends Activity {

    /** Called when the activity is first created. */

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

    }

    

    @Override

    public boolean onCreateOptionsMenu(Menu menu) {

    super.onCreateOptionsMenu(menu);

    MenuItem item1 = menu.add(0, 0, 0, "사과");

    {

    item1.setAlphabeticShortcut('a');

    item1.setIcon(android.R.drawable.btn_default_small);

    }

    MenuItem item2 = menu.add(0, 1, 1, "배");

    {

    item2.setAlphabeticShortcut('b');

    item2.setIcon(android.R.drawable.btn_default_small);

    }

    MenuItem item3 = menu.add(0, 2, 2, "딸기");

    {

    item3.setAlphabeticShortcut('c');

    item3.setIcon(android.R.drawable.btn_default_small);

    }

    menu.add(0, 3, 3, "감");

    menu.add(0, 4, 4, "귤");

    menu.add(0, 5, 5, "바나나");

    return true;

    }

    

   @Override

   public boolean onOptionsItemSelected(MenuItem item) {

       if(item != null){

  Toast.makeText(this, item.getTitle() + " selected", Toast.LENGTH_SHORT).show();

  return true;

       } else {

  return false;

       }

   }

 
이렇게 하면, 액션바 옆에 메뉴가 생긴다.

메뉴 화면 말고, 메뉴화면 옆에 아이콘을 따로 뺄수도 있는데, 그렇다면,
다음의 코드를 넣어주면 된다. 

 item1.setShowAsAction(MenuItem.SHOW_AS_ACTION_WITH_TEXT|MenuItem.SHOW_AS_ACTION_IF_ROOM);


예제.

    @Override

    public boolean onCreateOptionsMenu(Menu menu) {

    super.onCreateOptionsMenu(menu);

    MenuItem item1 = menu.add(0, 0, 0, "사과");

    {

    item1.setAlphabeticShortcut('a');

    item1.setIcon(android.R.drawable.btn_plus);
               item1.setShowAsAction(MenuItem.SHOW_AS_ACTION_WITH_TEXT
                                                              |MenuItem.SHOW_AS_ACTION_IF_ROOM);

    }




신고
크리에이티브 커먼즈 라이선스
Creative Commons License

'Programming > android/tablet' 카테고리의 다른 글

ActionBar에 메뉴 넣기.  (0) 2011.12.24
Action Bar 숨기기  (3) 2011.12.24
Fragment와 AddToBackStack  (0) 2011.12.24
java코드를 이용하여, Fragment사용하기.  (0) 2011.12.04
xml을 이용해 Fragment이용하기.  (9) 2011.12.04
fragment란?  (0) 2011.12.04

Action Bar 숨기기




액션바는 상단의 타이틀이 보이는 화면을 말한다. 
이를 숨기는 방법은 여러가지가 있다.

1. AndroidManifest.xml파일에서 숨기는 방법.
   theme를 다음과 같이 지정.

       <activity android:name=".ActionBarExample01Activity"

                  android:label="@string/app_name"

                  android:theme="@android:style/Theme.Holo.NoActionBar">

 
2. java코드에서 숨긴다.
    액티비티 안에서 다음과 같이 코드를 만든다.  

public class ActionBarExample01Activity extends Activity {

    /** Called when the activity is first created. */

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        

        ActionBar actionBar = getActionBar();

        actionBar.hide();

//        actionBar.show();

    }

}


이 방법을 사용할 때 유의할 점은, 1번 방법 Theme.Holo.NoActionBar"를  사용한 후에 호출하면, getActionBar()가 null이 나온다는 것.
코드로 액션바를 제어할 경우에는, 1번과 함께 쓰지 않는다.  
 
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

'Programming > android/tablet' 카테고리의 다른 글

ActionBar에 메뉴 넣기.  (0) 2011.12.24
Action Bar 숨기기  (3) 2011.12.24
Fragment와 AddToBackStack  (0) 2011.12.24
java코드를 이용하여, Fragment사용하기.  (0) 2011.12.04
xml을 이용해 Fragment이용하기.  (9) 2011.12.04
fragment란?  (0) 2011.12.04

Fragment와 AddToBackStack




Fragment에서, add나 Replace를 한 후, back버튼을 누르면, 이전 Fragment를 복원해 줄 수 있다.
바로, addToBackStack() 메소드를 이용한다.

샘플 코드는 다음과 같다.  

1. FragmentExample04Activity.java

package fragment.example04;


import android.app.Activity;

import android.app.FragmentTransaction;

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.LinearLayout;


public class FragmentExample04Activity extends Activity {

private Button addFragmentBtn;

private int currentIdx = 1;

    /** Called when the activity is first created. */

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        

        addFragmentBtn = (Button) findViewById(R.id.add_fragment);

        

        addFragmentBtn.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

FragmentTransaction ft = getFragmentManager().beginTransaction();

ft.replace(R.id.fragment_cont, new MyFragment(currentIdx));

ft.addToBackStack(null);

ft.commit();

currentIdx++;

}

});

    }

}

 
2. main.xml

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

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

    android:orientation="horizontal"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent">

    <LinearLayout

    android:id="@+id/fragment_cont"

    android:layout_weight="1"

    android:layout_width="0dip"

    android:layout_height="match_parent" />

    <Button

    android:id="@+id/add_fragment"

    android:layout_weight="0"

    android:layout_width="wrap_content"

    android:layout_height="match_parent"

    android:text="Add Fragment" />

</LinearLayout>

 
3. MyFragment.java

package fragment.example04;


import android.app.Fragment;

import android.os.Bundle;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.widget.TextView;


public class MyFragment extends Fragment {

private int currentCnt;

public MyFragment(int _currentCnt){

this.currentCnt = _currentCnt;

}


@Override

public View onCreateView(LayoutInflater inflater, ViewGroup container,

Bundle savedInstanceState) {

View view = inflater.inflate(R.layout.fragment, null);

((TextView) view.findViewById(R.id.title)).setText(currentCnt + "번째 Fragment.!");

return view;

}

}


 4. fragment.xml

<?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">

<TextView

            android:id="@+id/title"  

   android:layout_width="fill_parent" 

   android:layout_height="fill_parent" 

   android:text="@string/hello"  />

</LinearLayout>

 
위코드를 작성해 주면 된다. 

완성 화면은 다음과 같다. 


우측의 Add Fragment를 누르면, Fragment가 더해지며,

하단의 <- 버튼을 눌러주게 되면, 이전의 Fragment가 복원된다.

신고
크리에이티브 커먼즈 라이선스
Creative Commons License

'Programming > android/tablet' 카테고리의 다른 글

ActionBar에 메뉴 넣기.  (0) 2011.12.24
Action Bar 숨기기  (3) 2011.12.24
Fragment와 AddToBackStack  (0) 2011.12.24
java코드를 이용하여, Fragment사용하기.  (0) 2011.12.04
xml을 이용해 Fragment이용하기.  (9) 2011.12.04
fragment란?  (0) 2011.12.04

java코드를 이용하여, Fragment사용하기.




지난번에는, Fragment를 xml을 이용하여 Activity를 구성하는 방법을 알아봤고, 
2011/12/04 - [Programming/android/tablet] - xml을 이용해 Fragment이용하기.
이번에는, java파일을 이용하여, 화면을 구성하는 방법을 알아봅니다.

위 아래 화면이 나누어져 있는 단순한 화면인데요,
이를 Fragment2개를 이용하여, 만들어 봅니다.

1. android sdk 3.0이상을 생성하여, 안드로이드 프로젝트를 생성하여 줍니다. 

2. res에 fragment1.xml을 생성하여 줍니다.
[ fragment1.xml ]

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

<LinearLayout

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

  android:orientation="vertical"

  android:layout_width="match_parent"

  android:layout_height="match_parent">

  <TextView

   android:layout_width="fill_parent"

   android:layout_height="fill_parent"

   android:text="Fragment #1"

   android:gravity="center" />

</LinearLayout>

 
2. res에 fragment2.xml을 생성하여 줍니다.

[ fragment2.xml ]

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

<LinearLayout

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

  android:orientation="vertical"

  android:layout_width="match_parent"

  android:layout_height="match_parent">

  <TextView

   android:layout_width="fill_parent"

   android:layout_height="fill_parent"

   android:text="Fragment #2"

   android:gravity="center" />

</LinearLayout> 

 
 3. Fragment1을 생성하여 줍니다.
[ Fragment1.java ] 

package fragment.example01;


import android.app.Fragment;

import android.os.Bundle;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;


public class Frament1 extends Fragment {


@Override

public View onCreateView(LayoutInflater inflater, ViewGroup container,

Bundle savedInstanceState) {

return inflater.inflate(R.layout.fragment1, container, false);

}

}


여기서, onCreateView는 Activity의 onCreate와 같은 역할을 한다고 보시면 됩니다.

4. Fragment2.java를 생성하여 줍니다.

Fragment2.java

package fragment.example01;


import android.app.Fragment;

import android.os.Bundle;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;


public class Frament1 extends Fragment {


@Override

public View onCreateView(LayoutInflater inflater, ViewGroup container,

Bundle savedInstanceState) {

return inflater.inflate(R.layout.fragment1, container, false);

}

} 


 5. MainActivity를 고쳐준다.
[ FragmentExample02Activity.java ] 

package fragment.example02;


import android.app.Activity;

import android.app.FragmentManager;

import android.app.FragmentTransaction;

import android.content.res.Configuration;

import android.graphics.drawable.GradientDrawable.Orientation;

import android.os.Bundle;

import android.view.WindowManager;


public class FragmentExample02Activity extends Activity {

    /** Called when the activity is first created. */

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        

        FragmentManager fragmentManager = getFragmentManager();

        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

        

        if(getWindowManager().getDefaultDisplay().getOrientation()==Configuration.ORIENTATION_PORTRAIT){

        Fragment1 fragment1 = new Fragment1();

        fragmentTransaction.replace(android.R.id.content, fragment1);

        } else {

        Fragment2 fragment2 = new Fragment2();

        fragmentTransaction.replace(android.R.id.content, fragment2);

        }

        fragmentTransaction.commit();

    }

}

 
이렇게 작성하여 실행하여 주면, 다음과 같이 화면이 나타납니다.


Portrait모드에서는, fragment1이, Landscape모드에서는, fragment2가 나타나게 됩니다.

자바 코드에서 Dynamic하게, Fragment를 로딩하는 것입니다.
이를 어떻게 하는지 알아봅시다. 

// FragmentManager를 가지고 온다.
FragmentManager fragmentManager = getFragmentManager();
// FragmentTransaction을 가지고 온다.
FragmentTransaction fragmentTransaction = fragment.beginTransaction(); 
 
만약, 세로보기 모드라면, Fragment1을 보여준다.
여기서, android.R.id.content는, 액티비티의 content view를 나타낸다.

if(getWindowManager().getDefaultDisplay().getOrientation()==Configuration.ORIENTATION_PORTRAIT){

        Fragment1 fragment1 = new Fragment1();

        fragmentTransaction.replace(android.R.id.content, fragment1);

}
// 만약 가로보기 모드라면, Fragment2를 보여준다.
 else {

        Fragment2 fragment2 = new Fragment2();

        fragmentTransaction.replace(android.R.id.content, fragment2);

}
// Replace한 내용을 반영하기 위하여 commit()을 해준다.
// commit()을 하지 않으면, 변동사항이 반영되지 않는다. 

fragmentTransaction.commit(); 

 
위는 Fragment가 무엇인지 알아보기 위해 작성한 간단한 예제이며, 경우에 따라서 다르게 만들어 적용하셔야 합니다.

프로젝트 소스

실행파일

관련글 
2011/12/04 - [Programming/android/tablet] - xml을 이용해 Fragment이용하기.

신고
크리에이티브 커먼즈 라이선스
Creative Commons License

'Programming > android/tablet' 카테고리의 다른 글

ActionBar에 메뉴 넣기.  (0) 2011.12.24
Action Bar 숨기기  (3) 2011.12.24
Fragment와 AddToBackStack  (0) 2011.12.24
java코드를 이용하여, Fragment사용하기.  (0) 2011.12.04
xml을 이용해 Fragment이용하기.  (9) 2011.12.04
fragment란?  (0) 2011.12.04

xml을 이용해 Fragment이용하기.



Activity도 그렇듯, Fragment도 역시, 자바코드에서 생성하는 방법과, xml에서 생성하는 방법이 있습니다.

먼저, xml을 이용하여, Fragment를 추가하는 방법을 알아봅니다. 
굉장히 단순한 예제 입니다.

우리가 만들어볼 화면은 아래와 같습니다. 


위 아래 화면이 나누어져 있는 단순한 화면인데요,
이를 Fragment2개를 이용하여, 만들어 봅니다.

1. android sdk 3.0이상을 생성하여, 안드로이드 프로젝트를 생성하여 줍니다. 

2. res에 fragment1.xml을 생성하여 줍니다.
[ fragment1.xml ]

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

<LinearLayout

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

  android:orientation="vertical"

  android:layout_width="match_parent"

  android:layout_height="match_parent">

  <TextView

  android:layout_width="fill_parent"

  android:layout_height="fill_parent"

  android:text="Fragment #1"

  android:gravity="center" />

</LinearLayout>


 2. res에 fragment2.xml을 생성하여 줍니다.
[ fragment2.xml ]

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

<LinearLayout

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

  android:orientation="vertical"

  android:layout_width="match_parent"

  android:layout_height="match_parent">

  <TextView

  android:layout_width="fill_parent"

  android:layout_height="fill_parent"

  android:text="Fragment #2"

  android:gravity="center" />

</LinearLayout>

 
3. 자동 생성된 main.xml의 코드를 바꾸어 줍니다. 
[ main.xml ]

<?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">

    <fragment

android:name="fragment.example01.Fragment1"

android:id="@+id/fragment1"

android:layout_weight="1"

        android:layout_width="fill_parent" 

        android:layout_height="0dip"  />

    <fragment

android:name="fragment.example01.Fragment2"

android:id="@+id/fragment2"

android:layout_weight="1"

        android:layout_width="fill_parent" 

        android:layout_height="0dip"  />

</LinearLayout>  


여기서 눈여겨 보아야 할것은, android:name="..." 부분이며, 여기서 나타내는 것은, Fragment클래스의 위치를 나타내 줍니다.
즉, fragment.example01패키지에 Fragment1, Fragment2 자바 파일이 존재하여야 하는 겁니다.

4. Fragment1을 생성하여 줍니다.
[ Fragment1.java ] 

package fragment.example01;


import android.app.Fragment;

import android.os.Bundle;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;


public class Frament1 extends Fragment {


@Override

public View onCreateView(LayoutInflater inflater, ViewGroup container,

Bundle savedInstanceState) {

return inflater.inflate(R.layout.fragment1, container, false);

}

}


여기서, onCreateView는 Activity의 onCreate와 같은 역할을 한다고 보시면 됩니다.

5. Fragment2.java를 생성하여 줍니다.

Fragment2.java

package fragment.example01;


import android.app.Fragment;

import android.os.Bundle;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;


public class Frament1 extends Fragment {


@Override

public View onCreateView(LayoutInflater inflater, ViewGroup container,

Bundle savedInstanceState) {

return inflater.inflate(R.layout.fragment1, container, false);

}

}

 

6. 어플리케이션을 실행시킵니다.
그러면, 위에도 올렸던, 그림이, 다음과 같이 짜잔하고 나옵니다. 

 
다음에는, xml을 이용하지 않고, 자바코드에서 fragment를 이용하는 법을 알아 봅니다. 


소스코드 :   
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

'Programming > android/tablet' 카테고리의 다른 글

ActionBar에 메뉴 넣기.  (0) 2011.12.24
Action Bar 숨기기  (3) 2011.12.24
Fragment와 AddToBackStack  (0) 2011.12.24
java코드를 이용하여, Fragment사용하기.  (0) 2011.12.04
xml을 이용해 Fragment이용하기.  (9) 2011.12.04
fragment란?  (0) 2011.12.04

fragment란?



안드로이드 3.0에서, 새로 도입된 개념으로, 일종의 다른 형태의 미니 액티비티라고 보면 된다. include를 사용하여, 개발을 할경우, view , UI는 포함 할 수 있지만, function은 사용할 수 없습니다. 하지만, Fragment를 사용하면, UI , 기능을 동시에 재사용 할 수 있습니다.

기존의 기능을 재사용하려면, ui include하더라도, 기능 코드를 따로 삽입해야 했는데요, Fragment를 이용하면, 이 작업을 간단하고 편리하게 할 수 있다는 것입니다.

왜 이런, 기능이 안드로이드 3.0이 들어서서, 나오게 되었냐면, 기존에 사용하였던 어플리케이션을, 3.0에서 재사용할 수 있게 하는 과정이 필요했기 때문입니다. 기존 작은 해상도에 비해서, 큰 타블렛을 채울때는 다른 레이아웃 및 기능이 필요한데, 그 기능을 재활용하는 개념이 필요했기 때문입니다.


이미지 출처는 안드로이드 개발자 사이트.

예를 들어, 위사진에서, 타블렛은 저렇게 나오지만, 폰에서는 작게 2개의 화면으로 표현되는 거죠,

타블렛에서는, 이를 두개의 Fragment로 하나의 Activity를 채우고,

폰에서는, 2개의 Activity로 표현을 하는 것입니다.

이러한, Fragment는 항상 액티비티에 포함되어야 하며, 홀로 존재할수는 없습니다.


Activity도 여러가지가 있듯이, Fragment도 여러가지가 존재하는데요,

DialogFragment, ListFragment,  PreferenceFragment가 있습니다.
 

Fragment에 관련된 내용은 다음의 개발자 사이트를 참조합니다.

http://developer.android.com/guide/topics/fundamentals/fragments.html


관련글 : 

2011/12/04 - [Programming/android/tablet] - java코드를 이용하여, Fragment사용하기.
2011/12/04 - [Programming/android/tablet] - xml을 이용해 Fragment이용하기. 

신고
크리에이티브 커먼즈 라이선스
Creative Commons License

'Programming > android/tablet' 카테고리의 다른 글

ActionBar에 메뉴 넣기.  (0) 2011.12.24
Action Bar 숨기기  (3) 2011.12.24
Fragment와 AddToBackStack  (0) 2011.12.24
java코드를 이용하여, Fragment사용하기.  (0) 2011.12.04
xml을 이용해 Fragment이용하기.  (9) 2011.12.04
fragment란?  (0) 2011.12.04

안드로이드 단말기 버전 알아오기




현재 단말기의 버전을 알아오고 싶다면, 다음의 코드를 이용하면 된다. 
그리고, 아래와 같이 상황에 맞춰서 대처하여 보자.

OS별 코드 버전 넘버는 전의 포스트 참조. (2011/11/17 - [Programming/android] - Android의 역사.)

 

int version = android.os.Build.VERSION.SDK_INT;
 

switch (version) {

case 2:

Log.d("VERSION", "? 1.1");

break;

case 3:

Log.d("VERSION", "CUPCAKE 1.5");

break;

case 4:

Log.d("VERSION", "DONUT 1.6");

break;

case 5:

Log.d("VERSION", "ECLAIR 2.0");

break;

case 6:

Log.d("VERSION", "ECLAIR 2.0.1");

break;

case 7:

Log.d("VERSION", "ECLAIR 2.1");

break;

case 8:

Log.d("VERSION", "FROYO 2.2");

break;

case 9:

Log.d("VERSION", "GINGERBREAD 2.3");

break;

case 10:

Log.d("VERSION", "GINGERBREAD 2.3.3-2.3.4");

break;

case 11:

Log.d("VERSION", "HONEYCOMB 3.0");

break;

case 12:

Log.d("VERSION", "HONEYCOMB 3.1");

break;

case 13:

Log.d("VERSION", "HONEYCOMB 3.2");

break;

case 14:

Log.d("VERSION", "ICECREAMCAKE 4.0");

break;

}


이상.

신고
크리에이티브 커먼즈 라이선스
Creative Commons License

Android의 역사.



안드로이드의 역사? 랄 것도 조금은 어색하지만, 그동안 버전 및 특징 그리고, 히스토리 들을 알아보는 시간을 가져볼까요,

Android Version

안드로이드는 스펠링 순으로 먹는 것을 컨셉으로 하여 코드 네임을 짓고 있죠, 나름 맞추는 재미가 쏠쏠하다는…    

안드로이드 버전에 대해서 자세히 알고 싶다면, 개발자 사이트가 제일 좋겠죠,

하기 사이트 참조 바랍니다.

http://developer.android.com/sdk/index.html

  그래도 간단하게 정리.

Android Version

RELEASE DATE 

CODENAME 

API Level

FEATURE 

1.1

February 2009

 

2

 

1.5

April 2009

Cupcake

3

 

1.6

September 2009

Donut

4

 

2.0

October 2009

Eclair

5

 

2.0.1

December 2009

-

6

 

2.1

January 2010

-

7

 

2.2

May 2010

Froyo

8

외장메모리 설치 지원 등..

2.3

December 2010

Gingerbread

9

Sip, Voip 지원, Keyboard copy/paste지원 등.

2.3.3

February 2011

-

10

 

2.3.4

May 2011

-

10

several bug fixes

3.0

February 2011

Honeycomb 

11

Tablet 용, 그래픽 기능 향상

3.1

May 2011

-

12

 

3.2

July 2011

-

13

 

4.0

October 2011

IcecreamSandwich

14

http://developer.android.com/sdk/android-4.0-highlights.html

그렇다면, OS별 사용도는 각각 어떨까요?

2011년 11월 3일 구글이 14일간 집계한 OS분포도는 다음과 같습니다.  

 

일별 통계는 다음과 같습니다. 


출처 : http://developer.android.com/resources/dashboard/platform-versions.html


신고
크리에이티브 커먼즈 라이선스
Creative Commons License

안드로이드란?



안드로이드 개발을 업으로 삼고 계속 일하고 있는 시점에서, 이제서야 Android가 무엇인가를 생각한다는게 우습다.

하지만, 난 아직 안드로이드를 너무 모르기에, 정리를 차근차근 해 나가고 있다.

오늘도 역시나,

 

  • 안드로이드란?

    사전에서 찾아보면 뜻은 다음과 같습니다.

    android – n. a robot with a human appearance.

    사람 형상을 한 로봇. 뭔가 난해합니다.
     

    그렇다면, 실제 안드로이드는 무엇일까요?

    안드로이드는 구글이 내놓은 리눅스(Ubuntu) 기반의, 모바일을 타겟으로한 운영체제 입니다.(요즘에는, 모바일을 벗어나 다양한 가전기기에도 안드로이드가 탑재되고 있지요,) 2005년 구글은 모바일 사업의 일환으로, Android를 인수했고, 작업을 시작했습니다.

    구글의 서비스가 대부분 그렇듯, 구글은 안드로이드 역시 무료로, 널리 사용되길 원했습니다. 그래서 Apache License로 배포 했구요,

    Apache License라 함은, 누구나 무료로 사용하고, 안드로이드를 customizing하여, 상용의 자신의 제품에 사용해도 상관이 없다는 것입니다.

    Apache License에 대해 좀더 알고 싶다면, 하단의 링크를 들어가 봅시다.

    http://www.apache.org/licenses/LICENSE-2.0.html

     

    이러한 점에서(무엇보다 공짜라는 점에서), 안드로이드는 휴대폰 Vendor들에게 굉장히 매력적인 시장으로 느껴지게 되었죠,

    Apple의 iPhone의 iOS에 대응할 그 무언가가 필요했던, 휴대폰 제조사에게는 더욱더 말입니다.

    휴대폰 Vendor들이라면, 우리나라의 삼성전자, LG전자, 팬텍, 이제는 구글에 인수된 Motorola, 대만의 HTC등이 있겠죠,

     

    안드로이드는 또한, 개발자에게도 매력적으로 다가왔는데요, 개발자는 휴대기기에 Android SDK를 이용하기만 하면, 누구나 간편하게 개발을 하고 판매하는 일이 가능하게 되었으니까요,

    이를 위해, 여타의 중간 도매상이 없어도, 개발한 제품을 소비자에게 다이렉트로 전달해 줄 수 있는 Android Market을 제공해 주었죠,

    물론, Android Market에 앱을 판매하려면, 개발자 등록비용(매년 갱신x, 평생)으로 $25이 들어가긴 합니다만, Apple의 개발자 등록 비용이 더 비싸다는 점과 매년 갱신해야 한다는 점, 또한 Apple PC를 가지고 있어야 개발이 가능하다는 점을 생각하면 굉장히 자유로운 조건이라고 판단됩니다.

    그래서, Android는 개발자들에게도 유행처럼 번져 나갔죠, 지금은 버블이 많이 진 것 같습니다만…

     

    주저리 주저리…

    아 , Gartner에서, 집계한 결과를 보면, 안드로이드 마켓 점유율이 50프로에 가깝다네요,
    http://news.cnet.com/8301-13506_3-20051610-17.html

     

    그리고, 2015년 모바일 운영체제에 대한 전망(물론 되어보기전엔 모르는 거겠죠,)에서도 안드로이드가 꽤나 긍정적으로 나왔네요,
    심비안에 대해서는 꽤나 부정적이네요, Window mobile에 대해서는 꽤나 긍정적이구요,
    하기 사이트에 기사가 있답니다. 

    http://news.cnet.com/8301-13506_3-20048236-17.html?tag=mncol;txt


    기사의 일부에서 발췌한, IDC에서 전망한 2015년 결과는 아래와 같습니다.


    (Credit: IDC)

     

    앗차, 좀더 알고 싶다면, android wiki를 보시는 것도 좋을 듯하네요.

    http://en.wikipedia.org/wiki/Android_(operating_system)

    또한, Android Developer 공식 사이트 정보

    http://developer.android.com/guide/basics/what-is-android.html

    아쉽게도 모두 영어,

     

신고
크리에이티브 커먼즈 라이선스
Creative Commons License

볼륨키로 미디어 볼륨만 조정가능하게 하기




내 어플리케이션 안에서는, 볼륨키로 전화 음량을 조정하는 것이 아닌, 미디어 볼륨만 조정 가능하도록 하자.

    @Override

    public boolean onKeyDown(int keyCode, KeyEvent event) {

     AudioManager audio = (AudioManager)this.getSystemService(Context.AUDIO_SERVICE); 

      switch (keyCode) {

      case KeyEvent.KEYCODE_VOLUME_UP:

       audio.adjustStreamVolume(AudioManager.STREAM_MUSIC,AudioManager.ADJUST_RAISE,AudioManager.FLAG_SHOW_UI);

       return true;

      case KeyEvent.KEYCODE_VOLUME_DOWN:

       audio.adjustStreamVolume(AudioManager.STREAM_MUSIC,AudioManager.ADJUST_LOWER,AudioManager.FLAG_SHOW_UI);

       return true;

      } 

     return super.onKeyDown(keyCode, event);

    }

 
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

안드로이드 키보드 보이기, 숨기기



 

특정 동작을 했을 때, 소프트 키보드를 보여주고 싶을때에 사용한다.
키보드를 제어하려면 InputMethodManager객체를 사용한다.
InputMethodManager는 "android.view.inputmethod"에 존재한다.

이 객체는 activity에서, getSystemService로 구할 수 있으며, 변수는 Context.INPUT_METHOD_SERVICE로 구하여 오면 된다.

키보드를 보여줄때는,
public boolean showSoftInput (View view, int flags, ResultReceiver resultReceiver) 를 사용하고,

키보드를 가릴때는,
public boolean hideSoftInputFromWindow (IBinder windowToken, int flags) 를 사용하면 된다.

예를 들어보자.

[ ImmActivity.java ]

 

import android.view.inputmethod.InputMethodManager;

import android.widget.EditText;

 

public class ImmActivity extends Activity {

        

private InputMethodManager imm;

private EditText searchTxt;

      

     /** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState, CURRENT_MENU);

setContentView(R.layout.main);

init();

}

 

private void init(){

    imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);

    searchTxt = (EditText) findViewById(R.id.search_edittext);

}

 

/**

* 키보드를 가림.

*/

private void hideKeyboard(){

    imm.hideSoftInputFromWindow(searchTxt.getWindowToken(), 0);

}

 

/**

* 키보드를 보여줌.

*/

private void showKeyboard(){

    imm.showSoftInput(searchTxt, 0);

}

}

 

굉장히 간단한 예제이므로, 별도의 설명이 필요없는…
그냥 위와 같이, init()에서 선언해주고, 필요에 따라서, showKeyboard(), hideKeyboard()를 호출하여 주면 된다는…
설명할 것도 없는 것을 주저리 주저리 적은듯…

 + 

내가 자주 사용하는 ,hideKeyboard() function

private void hideKeyboard(){

InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 

inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);

}


신고
크리에이티브 커먼즈 라이선스
Creative Commons License

현재실행중인 액티비티 구하기




현재 액티비티가 실행 중이라면, true를 반환하고,
실행중이 아니라면, false를 반환합니다.

    private boolean isActivityTop(){

    ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);

        List<RunningTaskInfo> info;

        info = activityManager.getRunningTasks(1);

        if(info.get(0).topActivity.getClassName().equals(PhoneStateReceiverTestActivity.this.getClass().getName())) {

             return true;

        } else {

             return false;

        }

    }

 
info = activityManager.getRunningTasks(1); 는 태스크 리스트를 1개 가져온다는 뜻이고, 
리스트 형식으로 반환하여 주므로, 상황에 맞게 응용하여 사용하시면 되겠습니다. 
 
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

sd카드에 database 저장하기.




sqlopenhelper를 사용해 데이터베이스를 생성하게될 경우에, 보통 "data/ data / 패키지명 / db / 데이터베이스파일"로 생성이 되게 된다.

이 경로는 내가 원하는 곳으로 바꿀 수는 없을까?

이는 다음과 같이 하면 된다.

생성자에서 filePath만 새로 잡아주면 됩니다.

예 > 

public static final String FILE_PATH = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + SQLITE_FILE;

public DBOpenHelper(Context context){

super(context, FILE_PATH, null, DB_VERSION);

}


 자동 생성되는, onCreate, onUpdate에 있는 내용은 동일하게 쓰셔도 무방합니다.

저의 풀소스,

public class DBOpenHelper extends SQLiteOpenHelper {

private static final int DB_VERSION = 1;

public DBOpenHelper(Context context){

super(context, Constants.FILE_PATH, null, DB_VERSION);

}

@Override

public void onCreate(SQLiteDatabase db) {

db.execSQL(getCreateCategoryTableString());

}

@Override

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

db.execSQL("DROP TABLE IF EXISTS " + DBConstants.TABLE_NAME);

onCreate(db);

}

private String getCreateCategoryTableString(){

   return "CREATE TABLE "+ DBConstants.TABLE_NAME +" ( "

   + _ID   + " INTEGER PRIMARY KEY AUTOINCREMENT, "  

   + DBConstants.ID + " INTEGER NOT NULL, "

   + DBConstants.TITLE_KOR       + " TEXT NOT NULL, "

   + DBConstants.ENG    + " TEXT NOT NULL, "

   + DBConstants.CODE_NUM    + " TEXT NOT NULL, "

   + DBConstants.SDATE    + " TEXT NOT NULL ) ; ";

}

}

 

참조 : 2011/02/08 - [Programming/android] - android에서 외부(sdcard) db를 열려면?

신고
크리에이티브 커먼즈 라이선스
Creative Commons License

안드로이드 좌우 변환시 대처사항




안드로이드는 좌우 전환이 일어날때마다, onCreate가 다시 일어나게 된다.
상황에 따라서, 이는 안좋을 수 있기 때문에 막는 경우도 있다.

좌우 전환에 따라서, Create를 안하게 하기 위해서는,  

<activity android:name=".ViewVideo" android:theme="@android:style/Theme.NoTitleBar.Fullscreen"  
                  android:configChanges="orientation|keyboardHidden">

                  <intent-filter>
                        <action android:name="android.intent.action.VIEW" />
                        <category android:name="android.intent.category.DEFAULT" />
                  </intent-filter>
            </activity>
      </application>
</manifest> 


AndroidManifest.xml의 해당액티비티에, 위 예제와 같이  android:configChanges="orientation|keyboardHidden"  써주면 된다.

하지만, 그렇다고 좌우 전환시마다 리소스가 바뀌어야 하는경우가 있다.
이럴때는, Activity의 onConfigurationChanged(Configuration newConfig)를 오버라이드 하여 사용하여 주면 된다.
이는 화면의 상태가, landscape <-> portrait로 바뀔때 호출이 되며,
android:configChanges="orientation|keyboardHidden" 상태일때만 호출이 된다.

사용 예는 다음과 같다.

  /**
     * 화면 좌/우 전환이 일어났을때, 백그라운드 모양을 바꾸어준다.
     */
    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        // 가로 상태일때 

        if(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE){
            introBack.setBackgroundDrawable(getResources().getDrawable(R.drawable.t_cover_bg_land));
        } // 세로 상태일때

else if(newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){

            introBack.setBackgroundDrawable(getResources().getDrawable(R.drawable.t_cover_bg));
       }
    }



저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

sd카드 사용가능 공간 알아오기




A
ctivity 안에서, 다음 코드를 써주면 됩니다.

StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getAbsolutePath()); long space = stat.getBlockSize() * stat.getAvailableBlocks();


 
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

color를 xml로 사용하기.



1. 먼저 res > values 폴더안에 colors.xml파일을 생성해줍니다.

2. colors.xml에 색을 넣어줍니다.

<?xml version="1.0" encoding="utf-8"?>
<resources>
     <!-- 흰색 -->
 
     <color name="white">#ffffff</color>
....
</resources>


3. 사용합니다.

사용법 :

xml 파일에서는, "@color/white"

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
android:background="@color/red"    
    android:layout_width="match_parent"
    android:layout_height="match_parent">


java 파일에서는, 

view.setBackgroundColor(getResources().getColor(R.color.red)); 

 
자바에서,
그냥 view.setBackgroundColor(R.color.red); 요런식으로 사용하시게 되면, 참조를 못읽게 되어서, 원하시는 색상 출력하실 수 없습니다.
위의 방법을 사용하셔야 합니다. 

추가 자세한 사항은 역시나, api를 참조합시다.
http://developer.android.com/guide/topics/resources/more-resources.html#Color
 
 

저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

'Programming > android' 카테고리의 다른 글

[VideoView] 로컬 비디오파일 설정  (0) 2011.08.04
screen on / off  (0) 2011.07.12
color를 xml로 사용하기.  (1) 2011.06.24
나인패치  (3) 2011.06.24
스크롤상태를 확인가능한 ScrollView  (13) 2011.06.21
외부 라이브러리 사용하기  (0) 2011.06.16

나인패치



안드로이드 나인패치란?
 
일반 png의 이미지에, 늘어날 수 있는 영역을 지정해주는 것입니다. PNG 이미지로 되어있는데
Stretchable(늘어나는) 영역을 정의할 수 있습니다. 이 나인패치 이미지는 보통 뷰(View)의 배경이미지로 사
용됩니다.
이에 대한 개념 정리는, 여타 사이트에 워낙 잘 설명이 되어있고, 제가 더 잘설명할 자신이 없어, 생략합니다.
아래 사이트 참조하세요.
 

쉽게 말해, 나인패치를 만드는 법은 이미지에, 늘어날수 있는 영역을 그려주시면 됩니다.
그림만으로는 이해가 잘 안가실테니, 예제를 보여드리겠습니다.


 
첫번째 예제.
 
다음과 같은 이미지가 있습니다. 이 이미지를 버튼에 배경으로 적용할 것입니다.
Left, top 부분이 늘어나는 영역, right, bottom영역이 내용이 들어가는 영역입니다.
204 x 70pixel



나인패치를 이용하여 적용하면 다음과 같습니다.
동그란 부분은 손상되지 않고, 깨지지 않으면서 이미지가 그려진걸 볼 수있습니다.


 
두번째 예제.
 
어떻게 늘어나는지 보여드리기 위해, 이미지에 약간 그림을 그렸습니다.
방금 전의 뷰를 이번의 이미지로 바꾸어서 보여주게 되면 다음과 같습니다.
204 x 70pixel

 



 
세번째 예제.
 
첫번째, 두번째에서는 내용영역을 넓게 잡아서, 내용이 적어도 최소사이즈가 큰 것을 확인할 수 있었는데,
이번에는 내용의 크기에 따라서, 버튼의 크기가 좀더 유동적입니다.
적용이미지는 다음과 같습니다.
45 x 35pixel



이전의 이미지보다 좀더 유동적으로 그려진것을 볼 수 있겠습니다.
내용이 들어가는 영역을 좀 좁혀놨기때문에 글자가 작을경우에도, 일정 크기를 유지하지 않네요.


  
나인패치 적용법
 
위의 사이트에보면 안드로이드 sdk받아서 하라고 하시는 분들도 있는데, 그렇게 하셔도 되고 사용하시는 일
반 그래픽 에디터 사용하셔도 됩니다. 디자이너분들은 그래픽에디터가 익숙하시겠죠.
 
1. 일반적으로 작업된 이미지에 left, top, right, bottom 1pixel씩 margin을 넣어주시고 left, top, right,
bottom에 검은색 1px선으로 늘어날 영역을 그려주시면 됩니다.
 
2. 그리고 파일명을 다음과 같은 형식으로 저장해주시면 됩니다. [filename].9.png
 
이와 같은 작업을 해야하는 이유는, 안드로이드 단말기의 종류가 여러가지이고, 단말기마다 해상도가 다르
기 때문에, 레이아웃을 비율로 상대적으로 잡게 됩니다. 이럴경우, 백그라운드로 준 이미지를 임의로 늘리게
되면, 이미지가 깨지는 현상이 생기게 됩니다. 그렇기 때문에 나인패치라는 방법을 사용하여 이미지의 왜곡
을 최소한으로 막아 이미지를 적용하자는 것입니다.

위에 사용한 예제 파일은 다음과 같습니다.

저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

'Programming > android' 카테고리의 다른 글

screen on / off  (0) 2011.07.12
color를 xml로 사용하기.  (1) 2011.06.24
나인패치  (3) 2011.06.24
스크롤상태를 확인가능한 ScrollView  (13) 2011.06.21
외부 라이브러리 사용하기  (0) 2011.06.16
안드로이드 개발환경 구축하기  (0) 2011.06.07

외부 라이브러리 사용하기




1. 사용할 라이브러리를 준비해줍니다. (*.jar, *.so파일은 다르게 함, 나중에 정리하도록 합시다.)

2. 프로젝트를 만들어줍니다. 

3. 프로젝트에 마우스를 갖다대고 오른쪽을 클릭하여 New > Folder를 선택하여, libs라고 폴더를 추가하여 줍니다. 

 


4. libs폴더에 아까 1번에서 준비한 라이브러리를 복사해줍니다. 
복사된 모습 보이시죵,



5. 프로젝트를 클릭하여 오른쪽 마우스 클릭하여 BuildPath > ConfigureBuildPath 를 눌러줍니다.
   여기서, Add JARs 클릭. 해당 프로젝트의 libs로 찾아들어가 아까 복사해 둔 라이브러리를 추가해 줍니다. 
   그리고, OK 클릭.
 


6. 라이브러리 추가 완료입니다.
    이제, 추가된 라이브러리가 사용가능한지, 확인해 보시면 될겁니다.
      
저작자 표시 비영리 동일 조건 변경 허락
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

안드로이드 개발환경 구축하기




안드로이드 개발환경을 구축하는 방법입니다.
(윈도우 기준, 이클립스 갈릴레오 기준.)

developer사이트의 개발환경 구축하는 방법을 참고합니다. 
http://developer.android.com/sdk/installing.html 


1. Preparing Your Development Computer
   안드로이드 개발환경 구축을 위해서는 먼저 java가 설치되어야 합니다.
   시스템에 맞추어 java를 다운 받으시고, path까지 잡아주세요.
   다운로드 링크는 다음과 같습니다. 
    http://www.oracle.com/technetwork/java/javase/downloads/index.html 
    자바를 다운 받고, 패스를 설정하는 방법은, 다른 사이트에 워낙 잘나와 있어서 생략합니다.
    참조 하세요.
     http://plusblog.tistory.com/298 


2. Downloading the Sdk Stater Package
    안드로이드 SDK툴을 다운 받으셔야 합니다.
    다운로드 링크는 다음과 같습니다. 
    http://developer.android.com/sdk/index.html 
   여기서 또한 시스템에 맞는 것으로 다운 받으시고, 만약 .zip, .tgz를 다운 받으셨다면, 원하시는 폴더에 압축을 푸세요. 
    윈도우즈 사용하시면, 
android-sdk_r11-windows.zip받으시면 되겠죠, os에 맞게 받으세요, 

3. installing the adt plugin for eclipse
     이클립스에 안드로이드 개발을 위한 ADT(Android Development Tools)을 설치합니다.
     이클립스 갈릴레오 버전으로 Help > Install New SoftWare....가 있습니다.
     이곳에서, add를 눌러 줍니다. 

이름 : 아무거나.(혹은 그냥 android-sdk. 요정도..)
url : https://dl-ssl.google.com/android/eclipse/ 

 
    그리고, OK를 눌러 업데이트를 해줍니다. 시간은 약 15분정도 걸리네요. 
    중간에 뭐, 인증되지 않았는데, 설치 할것이냐고 물어보는데요, 그냥 Yes해주시면 됩니다.

4. 3번 과정을 완료하면, 다음과 같이 이클립스에 로봇의 모양이 뜨게 됩니다.


 이걸 누르게 되면, Available packages라고 뜨는데요, 여기서 update all해주시면 됩니다. 
  시간이 꽤나 걸립니다. 1시간 넘어갑니다.


  이렇게 설치해주시면 되구요,
  설치 완료 되시면, 프로젝트 새로 만들때,
  
  Android Project가 뜨구요, 만드시면 기본으로 생성되는 것이 Hello World가 뿌려지는 어플리케이션입니다. 

  모두들, 이제 Hello-World 출력해보세요. 

  이상입니다. 
 

신고
크리에이티브 커먼즈 라이선스
Creative Commons License

가로모드에서 editText 키보드가 화면을 덮을때 !



<EditText 

....
android:imeOptions="flagNoExtractUi" />


위의 글을 넣어주면 됩니다.
 
저작자 표시
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

유튜브 연결 인텐트



분홍글자부분의 아이디만 바꾸어 주면 됩니다. 

Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse("vnd.youtube:youTubeId"));
startActivity(i); 
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

EditText에 화폐단위(,) 붙이기.




목적 : 에딧텍스트에 숫자가 바뀔때마다, 3자리 숫자 단위로 콤마(,)를 찍어준다.

XML파일은 다음과 같다. 별다를 것 없는...
<EditText android:inputType="number" android:gravity="right" android:singleLine="true" android:layout_width="wrap_content" android:layout_height="wrap_content" />

자바 파일은 다음과 같다.

// 세자리로 끊어서 쉼표 보여주고, 소숫점 셋째짜리까지 보여준다.
DecimalFormat df = new DecimalFormat("###,###.####");
// 값 셋팅시, StackOverFlow를 막기 위해서, 바뀐 변수를 저장해준다.
String result="";

// 숫자가 바뀔때마다, 새로 셋팅을 해주어야 하므로, ChangeListener를 단다.

meterEditText.addTextChangedListener(new TextWatcher(){

            @Override
            public void afterTextChanged(Editable s) {}

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
 
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                 if(!s.toString().equals(result)){     // StackOverflow를 막기위해,
                    result = df.format(Long.parseLong(s.toString().replaceAll(",", "")));   // 에딧텍스트의 값을 변환하여, result에 저장.
        meterEditText.setText(result);    // 결과 텍스트 셋팅.
        meterEditText.setSelection(result.length());     // 커서를 제일 끝으로 보냄.
                }                
            }
        }); 

별것 아니지만, 애먹었네요, 
저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

'Programming > android' 카테고리의 다른 글

가로모드에서 editText 키보드가 화면을 덮을때 !  (1) 2011.05.25
유튜브 연결 인텐트  (0) 2011.05.23
EditText에 화폐단위(,) 붙이기.  (3) 2011.05.20
텍스트 마퀴효과  (0) 2011.04.21
전화걸기 인텐트  (0) 2011.04.21
SurfaceView 사용방법  (0) 2011.04.07

텍스트 마퀴효과




안드로이드에서 텍스트가 길면, 잘려서 안보이는 경우가 있다. 이런경우, 글자가 흘러가는 효과를 주어 보여주게 하는 방법이 있다.

main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <TextView 
      android:id="@+id/marquee_test"
      android:textSize="20px"
      android:focusable="true" 
      android:singleLine="true"
      android:ellipsize="marquee"
      android:marqueeRepeatLimit="marquee_forever"
      android:scrollHorizontally="true"
      android:focusableInTouchMode="true"
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content"
      android:text="1. This is marquee test. android test. 2. This is marquee test. android test."/>
</LinearLayout>

유의해서 봐야할 것은, 

android:focusable="true" 
android:singleLine="true"
android:ellipsize="marquee"
android:marqueeRepeatLimit="marquee_forever"
android:scrollHorizontally="true"
android:focusableInTouchMode="true"


이 속성들을 주어야 한다는 것이고, 

java파일에서, setSelected(true)를 적용해 주어야 한다는 것이다.

MarqueeTest.java 

public class MarqueeTest extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
((TextView) findViewById(R.id.text)).setSelected(true);
    }
}


이렇게 해주면, 길면 좌우로 흘러가는 텍스트뷰를 볼 수 있다.
 
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

'Programming > android' 카테고리의 다른 글

유튜브 연결 인텐트  (0) 2011.05.23
EditText에 화폐단위(,) 붙이기.  (3) 2011.05.20
텍스트 마퀴효과  (0) 2011.04.21
전화걸기 인텐트  (0) 2011.04.21
SurfaceView 사용방법  (0) 2011.04.07
getWindow(),requestFeature(int featureId) 종류  (0) 2011.02.20

마켓링크



Intent marketIntent = new Intent(Intent.ACTION_VIEW);
marketIntent.setData(Uri.parse("market://details?id=packageName"));
startActivity(marketIntent);



신고
크리에이티브 커먼즈 라이선스
Creative Commons License

전화걸기 인텐트




다음의 인텐트를 사용하여 주면 된다.
 

Intent mIntent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:01012345678"));
startActivity(mIntent);


신고
크리에이티브 커먼즈 라이선스
Creative Commons License

'Programming > android' 카테고리의 다른 글

EditText에 화폐단위(,) 붙이기.  (3) 2011.05.20
텍스트 마퀴효과  (0) 2011.04.21
전화걸기 인텐트  (0) 2011.04.21
SurfaceView 사용방법  (0) 2011.04.07
getWindow(),requestFeature(int featureId) 종류  (0) 2011.02.20
안드로이드 키보드의 InputType정리  (3) 2011.02.19

티스토리 툴바