ArrayAdapter<String>을 이용해 ListView에 String배열 데이터를 넣고
커스텀뷰를 적용한 사례이다.


리스트뷰의 글자크기나 요소간 간격(item height / element height)도 조절할 수 있다..


listView1은 activity_main.xml에서 배치한 리스트뷰의 아이디이다
소스파일(*.java)에서 ListView객체와 String배열을 정의한다
ListView view = (ListView)findViewById(R.id.listView1); 
String[] values = new String[LIST_NUM]; 
for(int i=0; i<LIST_NUM; i++) {
    values[i] = i;
}
그리고 어레이어댑터를 만들어 뷰에 적용.
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.my_text_view, values);
view.setAdapter(adapter);

바로 위의 코드에서 my_text_view는 임의로 이름 붙인 커스텀뷰인데, 이제 이것을 만들어야 한다
프로젝트 경로에서 res\layout(메인액티비티 레이아웃이 있는 폴더)에 새로운 xml 파일을 만든다.
이름은 위 코드에서 쓴 것과 같아야 한다.(여기서는 my_text_view.xml)

실제로 적용했었던 코드를 그대로 옮겨보면,
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/text1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceSmall"
    android:gravity="center_vertical"
    android:paddingStart="2dip"  //패딩(테두리 여백)
    android:textSize="21sp"  //글자 크기
    android:textColor="#EEEEEE"  //글자색
    android:minHeight="34dp"  //리스트 요소 폭
/>



다음과 같은 레아이웃이 적용된 리스트가 표시된다.

(https://play.google.com/store/apps/details?id=com.zetagate.pitchspeed)



pitching velocity unit converter (mph - kph) 제작일기...



구글플레이에서 다운받기 :

https://play.google.com/store/apps/details?id=com.zetagate.pitchspeed





◎ 레이아웃 설정과정.


→ 메인 액티비티 레이아웃 xml 에서 ListView 배치.


→ String 배열 생성후 값 저장


→  ArrayAdapter<String> 객체 생성. 


→ 객체 생성 시 TextView 레이아웃 리소스가 @android:layout/simple_list_item_1 로 지정되어 있어서

  스타일을 자유롭게 변경 불가..


→ 프로젝트 디렉터리 내 layout폴더에 사용자정의 레이아웃 xml파일 생성 후 TextView레이아웃 정의.

  android:minHeight 으로 간격 조절.


→ 어레이어댑터 생성자에서 데이터(String[])도 역시 지정.


→ ListView객체에서 setAdapter로 어레이어댑터(텍스트뷰 레이아웃과 리스트 데이터) 설정




◎ 데이터 생성과정 (정수(integer)로만 출력되도록 처리).


→ mph 속력 * 1.609344 를 계산하여 소수점 이하 자리를 취하고 det이라 함.


→ det < 1-RATIO/2 일 시 mph속력 하나당 kph속력 하나 출력.


→ 1-RATIO/2 < det < RATIO/2 일 시 mph속력 하나당 kph속력 두 개 출력


→ else  올림 처리하여 kph속력 하나 출력.


제작자 페이지 : http://zetagate.com








1. 우선 Keystore(키스토어)자체가 다른 경우. 당연히 업로드 실패가 뜬다.





2. 그렇다면 같은 키스토어 내에서 Alias가 다른 경우는?



이것 역시 업로드가 제한된다.





3. 패키지 경로가 다른 경우도 역시 실패.






그냥 궁금해서 직접 해봤습니다...










안드로이드 킷캣(api 19)이 나온 뒤 이클립스를 업데이트하고

새 프로젝트를 생성하니까 appcompat_v7이 포함되면서 이전에는 없던 문제들이 생긴다.


@android:style/Theme.NoTitleBar

는 실패.(런타임 에러가 난다)


@android:style/Theme.Holo.NoActionBar

는 minSdkVersion이 11이상(안드로이드 3.0 허니콤)일 때만 돼서 실패.


에러내용들을 보면

android:theme을 "@style/AppTheme"로 해야된다고 나오는데

그렇게 설정한 뒤 액티비티의 onCreate() 내에서 requestWindowFeature로 타이틀바를 없애야한다.

setContentView()를 호출하기 전에 해야된다는 것에 유의!


예시)

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);




이렇게 하면 어플 실행 시 타이틀바가 잠깐 보이다가 사라지는데

뭔가 미봉책 같은 느낌...

처음부터 appcompat_v7을 생성되지 않게 하면 기존방식대로 @android:style/Theme.NoTitleBar 으로 되지 않을까 싶은데 아직 해보지는 않았다


appcompat_v7이 생성되지 않게 하는 법은 인터넷으로 검색해보면 쉽게 찾을 수 있다. 




  1. 커피 2014.05.12 21:18

    너무 감사드립니다! 덕분에 오류 해결했습니다!

    • BlogIcon 티바이트 2014.05.13 23:48 신고

      아무래도 appcompat_v7이 생성않는 쪽으로 하는 게 나을 것 같은데 아직 정확히 모르겠네요ㅎ



구성

1. 서비스 실행 시 알림 띄우기

2. 알림을 지워지지 않게 만들기('실행 중' 탭에 띄우기)




1장.


 안드로이드 이전 버전에서는 노티피케이션(Notification)을 띄우기 위해 Notification 인스턴스를 만들어 사용했지만

지금은 Notification.Builder를 통해 생성하도록 권장하고 있다.

여기서는 이전 버전과의 호환성을 위해 android.support.v4.app 패키지의 NotificationCompat.Builder 객체를 사용한다.


 그렇기 때문에 android-support-v4.jar 파일을 프로젝트에 추가해야 하는데

이 파일은 안드로이드sdk 설치 디렉토리 - extras - android - support - v4  경로에 있다.

이 파일을 이클립스 기준으로, 프로젝트속성 - java build path - libraries에 들어가 포함시키면 된다.




 서비스에서 노티피케이션을 띄우기 위한 코드는 서비스의 onStartCommand 함수 내에 작성한다.

먼저 NotificationCompat.Builder 객체를 생성하고, 필수로 SmallIcon과 ContentTitle, ContentText를 지정해 주어야 한다.


(▽ 상단바에 왼쪽편에 있는 아이콘들이 SmallIcon들이다.) 


(▽ "USB가 연결되었습니다"문구가 ContentTitle이고, "컴퓨터로부터 또는 컴퓨터로..."부분이 ContentText이다.) 



그리고 노티피케이션을 터치했을 때 어떤 동작을 할 것인가를 지정해 주는데

여기서는 메인 액티비티인 MainActivity를 실행해 주기로 하였다.


Intent를 만든 뒤 TaskStackBuilder 객체에 추가하고

그것을 바탕으로 TaskStackPendingIntent 객체를 완성한다.

그리고 그 객체를 처음에 만들었던 NotificationCompat.Builder 객체에서 setContentIntent()로 설정.

마지막으로 NotificationManager를 생성하여 notify()시키면 노티피케이션이 뜨게 된다.


코드는 아래와 같다. 


   NotificationCompat.Builder mBuilder =

    new NotificationCompat.Builder(this)

    .setSmallIcon(R.drawable.smallicon)

    .setContentTitle("알림바 실험")

    .setContentText("알림바입니다..");

   

   Intent resultIntent = new Intent(getApplicationContext(),MainActivity.class);

 

   TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);

   stackBuilder.addParentStack(MainActivity.class);

   stackBuilder.addNextIntent(resultIntent);

   

   PendingIntent resultPandingIntent =

    stackBuilder.getPendingIntent(

    0,

    PendingIntent.FLAG_UPDATE_CURRENT

    );

   

   mBuilder.setContentIntent(resultPandingIntent);

   

   NotificationManager mNotificationManager =

  (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);

 

   mNotificationManager.notify(3452, mBuilder.build());



 NotificationCompat.Builder 객체를 만들 때, 스타일을 설정하는 set메서드들이 NotificationCompat.Builder 반환값을 가지므로

.setSmaillIcon().setContentTitle().setContentText() 와 같이 이어지게 될 수 있다.


 (노티피케이션이 등록될 때 상단바에 메시지가 나타나는 것은 setTicker().로 설정할 수 있다.)

 

 MainActivity라고 되어있는 부분은 노티피케이션을 선택했을 때 실행할 액티비티이며 상황에 맞게 다른 액티비티 이름이 올 수 있다.


 notify()함수에서 3452는 노티피케이션을 관리하기 위한 id값으로 여기서는 임의의 값을 써 둔 것이다.



다른 컨텍스트에서 노티피케이션을 종료해야 할 때는 다시 NotificationManager를 생성하여

아까 지정한 id(3452)를 통해 지울 수 있다. 코드는 다음과 같다.


  NotificationManager mNotificationManager =

   (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);

 

  mNotificationManager.cancel(3452); 




2장. 


 안드로이드 운영체제는 시스템 자원이 부족하다든지 하는 경우에 실행 중인 서비스를 끌 수도 있다. (꺼졌다가 다시 켜지기도 한다)

이를 방지하기 위해선 서비스를 포그라운드(Foreground)로 실행해야 한다. 

또한 알림을 지워지지 않고 '실행 중'탭에 놓기 위해서도 역시 포그라운드로 서비스를 실행하면 된다.

서비스를 포그라운드로 실행하려면 노티피케이션을 띄워 주어야 하는데

1장에서 만든 NotificationCompat.Builder 객체를 그대로 사용할 수 있다.

코드는 아래와 같다. (위 코드와 중복되는 부분이 대부분)



    NotificationCompat.Builder mBuilder =

     new NotificationCompat.Builder(this)

     .setSmallIcon(R.drawable.smallicon)

     .setContentTitle("알림바 실험")

     .setContentText("알림바입니다..");

    

    Intent resultIntent = new Intent(getApplicationContext(),MainActivity.class);

  

    TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);

    stackBuilder.addParentStack(MainActivity.class);

    stackBuilder.addNextIntent(resultIntent);

    

    PendingIntent resultPandingIntent =

     stackBuilder.getPendingIntent(

     0,

     PendingIntent.FLAG_UPDATE_CURRENT

     );

    

    mBuilder.setContentIntent(resultPandingIntent);

    

   this.startForeground(3452,mBuilder.build());


1장의 코드와 비교하여 NotificationManager 부분이 없어지고 startForeground()함수를 추가됐다.


노티피케이션을 제거할 때는 아래 코드로 포그라운드를 취소하면 된다.


this.stopForeground(true);




 ====================================================================================================

  1. 10121016 2013.09.21 23:11

    노티피케션 이용해서 알림테러하는 앱 만드는것도 가능?

  2. 익명 2013.09.24 14:34

    비밀댓글입니다

+ Recent posts