2011년 6월 29일 수요일

Java - 날짜 검증법

날짜를 String 값으로 받아서 Date 형식으로 변환했을때 exception 이 발생하지 않으면 정상 발생하면 비정상

SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
sdf.setLenient(false); //정확한 해석을 위해

try{
  //형식 맞음
}catch(Exception e){
 //형식 틀림
}

2011년 6월 24일 금요일

Android - Custom Font 적용

폰트파일위치 - assets/fonts

소스
Typefact tf = Typeface.createFromAsset(getAssets(), "fonts/폰트파일명");
TextView tv = (Textview) findViewById(R.id.CustomFont);
tv.setTypeface(tf);


이렇게 해주면 해당 폰트가 적용이 된다~

2011년 6월 20일 월요일

Android - Activity에서 Service 호출하기

상황
어느 Activity 에서 특정 이벤트를 발생 시켰을때 자신이 생성한 Service를 호출 하고 싶은경우

예) 위젯 설정 Activity에서 위젯의 바탕화면 이나, 폰트 등을 설정하였을경우 이게 바로 위젯으로 적용되었으면 하는 경우


Activity와 Service와 호출 하기 위해 aidl 이란걸 사용한다.

1. aidl 정의 (jh/project/widget/digital/biorhythm/IBiorhythmClockService.aidl)


package jh.project.widget.digital.biorhythm;

interface IBiorhythmClockService {
void updateWidgetIF();
}



2. Service에서 aidl Interface 구현, onBind 구현

package jh.project.widget.digital.biorhythm;

public class BiorhythmClockService extends Service{
    ...
    ...
    ...
    public class BiorhythmClockServiceImple extends IBiorhythmClockService.Stub {
@Override
        public void updateWidgetIF() throws RemoteException {
readAgain = true;
updateWidget();
        }
    }

    public IBinder onBind(Intent intent) {
    return new BiorhythmClockServiceImple();
    }

    private void updateWidget() {
       //Do Something
    }
    ...
    ...
    ...
}



3. Activity에서 해당 Interface 호출

package jh.project.widget.digital.biorhythm;

public class Configuration extends{

//Interface, ServiceConnection 정의
private IBiorhythmClockService biorhythmClockService = null;
private ServiceConnection biorhythmClockConn = new ServiceConnection() {
public void onServiceDisconnected(ComponentName p_name) {
biorhythmClockService = null;
}

public void onServiceConnected(ComponentName name, IBinder service) {
biorhythmClockService = IBiorhythmClockService.Stub.asInterface(service);
//callService();
}
};
      
        //binding 시작
protected void onStart() {
super.onStart();
bindService(new Intent(IBiorhythmClockService.class.getName()), biorhythmClockConn, Context.BIND_AUTO_CREATE);
}

        //binding 종료
protected void onStop() {
super.onStop();
unbindService(biorhythmClockConn);
}

//Interface 함수 호출하는 함수
private void callService() {
try {
biorhythmClockService.updateWidgetIF();
} catch(RemoteException e) {
Toast toast = Toast.makeText(this, "ERROR - " + e.getMessage(), Toast.LENGTH_SHORT);
toast.show();
}
}

// 뭔가 이벤트가 발생하면 위에서 만든 함수를 실행해서 Service에 함수를 호출한다.
//(Configuration.onClick() -> Configuration.callService() -> IBiorhythmClockService.updateWidgetIF() -> BiorhythmClockService.updateWidget() 순으로 실행된다.)

public void onClick(View v) {
...
...
...
callService();
...
...
...
}

}


※ 알고있는것을 말, 글로 표현한다는건 엄청 어려운일.
혹시 추가 코멘트나, 잘못된 정보 지적등 댓글 받습니다.

2011년 6월 14일 화요일

Item - 학교종이 땡땡땡

학교 생활에 필요한것들

시간표 (위젯)
과목관리(시험일정, 과제, 기타사항)
조원 관리(단체문자)
중요 메모(위젯)

또 뭐가 있을까...

Android - 어느 Widget에서 Configuration (Activity)를 호출하였나?

위젯을 생성할때 설정 화면(activity) 로 넘어가서 필요 한 데이터들을 설정한 다음에 위젯을 생성하는 경우가 있다.

manifast에

<activity android:name=".Configuration" android:label="@string/app_name" android:configChanges="keyboardHidden|orientation">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>


그리고 앱 위젯 프로바이더에

<appwidget-provider
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="294dip"
    android:minHeight="146dip"
    android:initialLayout="@layout/biorhythm_clock_widget"
    android:configure="jh.project.widget.digital.biorhythm.Configuration"/>

이렇게 설정 해주면 된다.

하지만 다양한 종류의 위젯에서 하나의 설정 화면을 호출하는경우, 필요에 따라서 어느 앱 위젯 프로바이더에서 설정 화면을 호출하였는가가 중요할 때도 있다.

이런 경우에는

설정 화면(activity)의 onCreate(Bundle savedInstanceState) 함수 안에


Intent intent = getIntent();
Bundle extras = intent.getExtras();
   if (extras != null) {
    widgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID,AppWidgetManager.INVALID_APPWIDGET_ID);


      AppWidgetManager manager = AppWidgetManager.getInstance(this);
      String className = manager.getAppWidgetInfo(widgetId).provider.getClassName();
    }
해주면 어느 프로바이더를 통해서 해당 activity가 호출 되었는지 알 수 있다.

2011년 6월 8일 수요일

Java - 1000 단위마다 콤마(,) 삽입하는 펑션

public static String insertComma(String arg){
int j = 0;
String rtnValue = new String();

for (int i = arg.length() - 1 ; i >= 0; i--){
j++;

rtnValue = arg.charAt(i) + rtnValue;
if(i > 0){
if(j == 3){
rtnValue = "," + rtnValue;
j = 0;
}
}
}

return rtnValue;
}

2011년 6월 7일 화요일

SQLite - Date, Time Functions

Functions
date( timestring, modifier, modifier, ...)
time( timestring, modifier, modifier, ...)
datetime( timestring, modifier, modifier, ...)
julianday( timestring, modifier, modifier, ...)
strftime( format, timestring, modifier, modifier, ...)


timestring

YYYY-MM-DD
YYYY-MM-DD HH:MM
YYYY-MM-DD HH:MM:SS
YYYY-MM-DD HH:MM:SS.SSS
YYYY-MM-DDTHH:MM
YYYY-MM-DDTHH:MM:SS
YYYY-MM-DDTHH:MM:SS.SSS
HH:MM
HH:MM:SS
HH:MM:SS.SSS
now
DDDD.DDDD

modifier

NNN days
NNN hours
NNN minutes
NNN.NNNN seconds
NNN months (see #551 and [1163] )
NNN years (see #551 and [1163] )
start of month
start of year
start of week (withdrawn -- will not be implemented)
start of day
weekday N (see #551 and [1163] )
unixepoch
localtime
utc



현재의 날짜를 알고 싶으면
select date('now');

현재 기준 20일 후의 날짜를 알고 싶으면
select date('now', '20 days');


현재 기준 20일 이전의 날짜를 알고 싶으면
select date('now', '-20 days');

이렇게 조회를 하면 'YYYY-MM-DD' 형태로 조회가 된다.

특정한 양식으로 조회 결과를 얻는다던가, 아니면 일자, 월, 년도만 따로 조회를 하고 싶다면, strftime을 사용하면 된다.

strftime 함수의 format 파라미터에 아래 파라 미터들을 조합해서 원하는 형태로 날짜, 시간을 조회 할 수 있다.

%d  day of month
%f  ** fractional seconds  SS.SSS
%H  hour 00-24
%j  day of year 001-366
%J  ** Julian day number
%m  month 01-12
%M  minute 00-59
%s  seconds since 1970-01-01
%S  seconds 00-59
%w  day of week 0-6  sunday==0
%W  week of year 00-53
%Y  year 0000-9999
%%  %

현재 일시를 'YYYY/MM/DD HH24:MI' 형태로 조회하고 싶다면
select strftime('%Y/%m/%d %H:%M', 'now');


2011년 6월 3일 금요일

Android - Custom ListView

use LayoutInflater


LayoutInflater


This class is used to instantiate layout XML file into its corresponding View objects. It is never be used directly -- usegetLayoutInflater() or getSystemService(String) to retrieve a standard LayoutInflater instance that is already hooked up to the current context and correctly configured for the device you are running on.
(http://developer.android.com/reference/android/view/LayoutInflater.html)



아래 구성 요소들이 필요하다
1. LIST를 구성하는 ROW의 LAYOUT FILE(layout 폴더에 위치, XML)
2. LIST의 내용이 되는 데이터 클래스
3. LIST에 VIEW를 제공하는 ArrayAdapter 상속 클래스



각각 파일 예제


1. ROW의 LAYOUT(layout/add_row.xml)


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:minHeight="60dp"
android:orientation="horizontal"
>
    <LinearLayout android:layout_marginRight="10dp"
          android:layout_height="wrap_content"
          android:id="@+id/linearLayout2"
          android:layout_marginBottom="10dp"
          android:layout_marginTop="10dp"
          android:layout_width="fill_parent"
          android:orientation="horizontal">
        <ImageView android:src="@drawable/icon"
                  android:id="@+id/list_view_row_add_row_icon"
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:layout_gravity="center_vertical"></ImageView>
        <TextView android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:id="@+id/list_view_row_add_row_name"
                  android:text="name"
                  android:layout_gravity="center_vertical"
                  android:textSize="25dp"
                  android:paddingLeft="5dp"></TextView>
    </LinearLayout>

</LinearLayout>

2. DATA 클래스(ActionDTO.java)

import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.view.View.OnClickListener;

public class ActionDTO {

private Drawable icon;
private String title;

public Drawable getIcon() {
return icon;
}
public void setIcon(Drawable icon) {
this.icon = icon;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}


3. ArrayAdapter(AddListViewAdapter.java)


import java.util.ArrayList;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class AddListViewAdapter extends ArrayAdapter<ActionDTO>{
private Context context;
private int layout;
private ArrayList<ActionDTO> actionList;
private LayoutInflater layoutInflater;


public AddListViewAdapter(Context context, int textViewResourceId, ArrayList<ActionDTO> objects) {
super(context, textViewResourceId, objects);
// TODO Auto-generated constructor stub
this.context = context;
this.layout = textViewResourceId;
this.actionList = objects;
                //LayoutInflater 생성
this.layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
ActionDTO action = actionList.get(position);

if(convertView == null){
                        //xml 파일로 정의된 layout 을 View 클래스로 변환
convertView = layoutInflater.inflate(layout, null);
}

if(action != null){
                        //convertView 라는 View 오브젝트를 이용해서 각각의 콤포넌트를 컨트롤
TextView tvName = (TextView) convertView.findViewById(R.id.list_view_row_add_row_name);
ImageView imgIcon = (ImageView) convertView.findViewById(R.id.list_view_row_add_row_icon);

tvName.setText(action.getTitle());
imgIcon.setImageDrawable(action.getIcon());
}

return convertView;
}
}



4. 실제 사용 예제


//listview, arraylist, adapter 초기화
ListView lstActionList = (ListView)findViewById(R.id.list_add);
ArrayList<ActionDTO> arrActionList = new ArrayList<ActionDTO>();
AddListViewAdapter adptActionList = new AddListViewAdapter(this, R.layout.add_row, arrActionList);

//adapter 세팅
lstActionList.setAdapter(adptActionList);

//list의 내용을 채울 ArrayList 작성

res = this.getResources();
ActionDTO action = new ActionDTO();
action.setTitle("ADD");
action.setIcon(res.getDrawable(android.R.drawable.ic_input_add));
arrActionList.add(action);

//listview refresh(?)
adptActionList.notifyDataSetChanged();


Android - Icon Size



ldpi (120 dpi)
(Low density screen)
mdpi (160 dpi)
(Medium density screen)
hdpi (240 dpi)
(High density screen)
xhdpi (320 dpi)
(Extra-high density screen)
Launcher Icon Size36 x 36 px48 x 48 px72 x 72 px96 x 96 px



Download the Icon Templates Pack for Android 4.0

from http://developer.android.com/guide/practices/ui_guidelines/icon_design.html

2011년 6월 2일 목요일

Android - Context

Class Overview
Interface to global information about an application environment. This is an abstract class whose implementation is provided by the Android system. It allows access to application-specific resources and classes, as well as up-calls for application-level operations such as launching activities, broadcasting and receiving intents, etc.

어플리케이션 환경에 관한 글로벌 정보를 접근하기 위한 인터페이스. Abstract 클래스이며 실재 구현은 안드로이드 시스템에 의해 제공된다. Context 를 통해, 어플리케이션에 특화된 리소스나 클래스에 접근할 수 있을 뿐만 아니라, 추가적으로, 어플리케이션 레벨의 작업 - Activity 실행, Intent 브로드캐스팅, Intent 수신 등, 을 수행하기 위한 API 를 호출 할 수도 있다.


엄청나게 자주 쓰이지만 개념이 잘 이해가....

그냥 간단히 말하면

Activity, Service 같은 애들의 정보를 가지고 있고, 걔네들을 제어 하는 함수들을 가지고 있는 인터페이스 정도?

2011년 6월 1일 수요일

Item - 작심삼일 [作心三日]

작심삼일 [作心三日]

결심한 마음이 사흘을 가지 못하고 곧 느슨하게 풀어짐. (출처 : 네이버 백과사전)

stand fast to one's resolution굳게 결심을 지키다.

Android - SMS Receiver

link
http://blog.naver.com/kippee?Redirect=Log&logNo=130042489189

잡담 - AdSense 가입 도전중 ㅠ.ㅠ

오늘 다시 가입 신청하고 (이번이 한 10번째? ㅋㅋㅋ)

다시 받은메일...(이것도 한 10번쯤? ㅋㅋㅋ)

"
Google AdSense에 관심을 가져주셔서 감사합니다. 귀하의 신청서를 검토한 결과 귀하의 웹 사이트는 Google 프로그램 기준에 부합하지 않는 것으로 확인되었습니다. 따라서 Google 프로그램에 대한 귀하의 신청을 접수할 수 없습니다.

Google은 Google 광고주뿐 아니라 게시자를 위해서도 Google 광고의 효과를 보장하기 위한 정책을 시행하고 있습니다. Google은 모든 게시자를 검토하고 있으며, 부적합한 웹 사이트를 거부할 권리를 보유합니다. 프로그램이 점차 성장해 감에 따라 더욱 다양한 웹 사이트에 저희 프로그램을 제공해 드릴 수 있도록 노력하고 있습니다.

Google은 자사의 의사 결정에 대한 구체적인 이유와 관련된 질의에는 응답해 드릴 수 없습니다. 양해해 주셔서 감사합니다.

감사합니다.

"



뭐 감사하다고 하면서 가입은 왜 안해주는지?

아니 남들처럼 심사 조차 안해주는 AdSense가 좀 서운하다 (신청한지 1, 2시간만에 메일이 바로 날라옴 ㅋㅋ)

ㅋㅋㅋ

누구 말대로 블로그가 아직 허접하고 글도 별로 없고 해서 가입이 안되는거라고 굳게 믿고 일단은 블로그의 구색을 좀 갖춰야 겠다


그런데... 블로그가 허접해서 그러는게 아니고 다른 문제가 있어서 그러는거면 어쩌지.....

라는 무서운 생각이 ㅋㅋㅋ