2010년 5월 24일 월요일

[android]Thread 예제 입니다.

이번에는 Thread 예제다..

 

#. 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"
    >
<TextView 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/hello"
    />
   
    <ProgressBar
     android:id = "@+id/progress"
     style="?android:attr/progressBarStyleHorizontal"
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
    />
</LinearLayout>

 

 

 

#. HandlerExample.java

 

package com.android.handlerExample;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.widget.ProgressBar;


/**
 * Message 객체 주요 메소드
 *   a. sendMessage()               : 넘겨받은 메시지를 즉시 메시지큐의 맨 뒤에 쌓는다.
 *   b. sendMessageAtFrontOfQueue() : 메시지큐의 맨 뒤가 아닌 맨앞에 쌓는다. 고로 다음 차례에

                                                         가장 먼저 처리됨.
 *   c. sendMessageAtTime()         : 특정 시간이 되면 메세지 큐에 쌓는다.
 *   d. sendMessageDelayed()        : 특정 시간이 지난 이후에 메시지큐에 쌓는다.
 */
public class HandlerExample extends Activity
{
 
 ProgressBar bar;
 Handler handler = new Handler()
 {
  public void handleMessage(android.os.Message msg)
  {
   bar.setMax(100);
   bar.incrementProgressBy(5);  // 5씩 증가하고 추가적인 작업은 하지 않는다.
  };
 };
 
 boolean isRunning = false;
 
 
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        bar = (ProgressBar) findViewById(R.id.progress);
       
        Thread background = new Thread(new Runnable()
        {
   public void run()
   {
    try
    {
     for ( int i = 0; i < 20 && isRunning; i++)
     {
      Thread.sleep(1000);        // 1초간 대기후
      handler.sendMessage(handler.obtainMessage()); // handler에 message 던져준다. 이작업 20번 반복!
     }
    }
    catch (Throwable t)
    {
     // 오류가 발생하면 백그라운드 스레드를 그대로 종료.
    }
   }
  });
       
        isRunning = true;
       
        background.start();
       
    }
   
   
    @Override
    protected void onStop()
    {
     super.onStop();
     isRunning = false;
    }
}

[android] Font Example

초간단 폰트 예제다...

기본적으로 3개의 폰트를 지원한다.

위 3개도 꽤 훌륭한데 사용자가 custom 해서 쓰고싶을 경우 예제임..

간혹, 트루타입 글꼴가운데 안드로이드가 읽지 못하는 글꼴이 있음.

가능하다면 글꼴 파일 이름 모두 소문자로 사용 하는 것이 좋음.

트루타입 글꼴을 사용하여 모든 글짜를 표현하면 파일 용량이 너무 커질 수도 있으므로

꼭! 필요한 글꼴만 추가하여 사용하는 것이 좋겠다..

 

#. main.xml

<?xml version="1.0" encoding="utf-8"?>
<TableLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 android:stretchColumns="1">
 <TableRow>
  <TextView
   android:text="sans:"
   android:layout_marginRight="4px"
   android:textSize="20sp"
  />
  <TextView
   android:id="@+id/sans"
   android:text="Hello, world!"
   android:typeface="sans"
   android:textSize="20sp"
  />
 </TableRow>
 <TableRow>
  <TextView
   android:text="serif:"
   android:layout_marginRight="4px"
   android:textSize="20sp"
  />
  <TextView
   android:id="@+id/serif"
   android:text="Hello, world!"
   android:typeface="serif"
   android:textSize="20sp"
  />
 </TableRow>
 <TableRow>
  <TextView
   android:text="monospace:"
   android:layout_marginRight="4px"
   android:textSize="20sp"
  />
  <TextView
   android:id="@+id/monospace"
   android:text="Hello, world!"
   android:typeface="monospace"
   android:textSize="20sp"
  />
 </TableRow>
 <TableRow>
  <TextView
   android:text="Custom:"
   android:layout_marginRight="4px"
   android:textSize="20sp"
  />
  <TextView
   android:id="@+id/custom"
   android:text="Hello, 안녕하세요"
   android:textSize="20sp"
  />
 </TableRow>
</TableLayout>

 

 

#. FontExample

package com.android.fontExample;

import android.app.Activity;
import android.graphics.Typeface;
import android.os.Bundle;
import android.widget.TextView;

public class FontExample extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        TextView tv = (TextView) findViewById(R.id.custom);
       
        // 원하는 글꼴 assert/디렉토리 에 포함..
        Typeface face = Typeface.createFromAsset(getAssets(), "fonts/HandmadeTypewritter.ttf");
       
        tv.setTypeface(face);
    }
}

Dialog Example

# Dialog
  1. Simple 하게 Window창 한개 Load
  2. 메세지박스(Yes Or No)
  3. Dialog Choice(여러개중 한개 선택..)
  4. ProgressBar 진행상태바


#. DialogTest

package com.android.DialogTest;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.view.View.OnClickListener;
import android.widget.Button;

public class DialogTest extends Activity {
 
 protected static final int DIALOG_SIMPLE_MESAGE = 0;
 protected static final int DIALOG_YES_NO_MESAGE = 1;
 protected static final int DIALOG_CHOICE_MESAGE = 2;
 protected static final int DIALOG_PROGRESS_MESAGE = 3;
 private int mProgress;
 private Handler mProgressHandler;
 ProgressDialog mProgressDialog;
 
 
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        Button simpleDlg = (Button) findViewById(R.id.simple);
        simpleDlg.setOnClickListener(new OnClickListener()
        {
   @Override
   public void onClick(View v)
   {
    Log.v("DialogTest", "onCreate()  DIALOG_SIMPLE_MESAGE!!!!!!!");
    showDialog(DIALOG_SIMPLE_MESAGE);
   }
  });
       
        Button btnYesNo = (Button) findViewById(R.id.yesNo);
        btnYesNo.setOnClickListener(new OnClickListener()
        {
   @Override
   public void onClick(View v)
   {
    Log.v("DialogTest", "onCreate() DIALOG_YES_NO_MESAGE!!!!!!!");
    showDialog(DIALOG_YES_NO_MESAGE);
   }
  });
       
        Button btnChoice = (Button) findViewById(R.id.choice);
        btnChoice.setOnClickListener(new OnClickListener()
        {
   @Override
   public void onClick(View v)
   {
    Log.v("DialogTest", "onCreate() DIALOG_CHOICE_MESAGE!!!!!!!");
    showDialog(DIALOG_CHOICE_MESAGE);
   }
  });
       
        Button btnProgressButton = (Button)findViewById(R.id.progress);
        btnProgressButton.setOnClickListener(new OnClickListener()
        {
   @Override
   public void onClick(View v)
   {
    Log.v("DialogTest", "onCreate() DIALOG_PROGRESS_MESAGE!!!!!!!");
    showDialog(DIALOG_PROGRESS_MESAGE);
    mProgress = 0;
    mProgressDialog.setProgress(0);   // progress의 초기값을 0으로
    mProgressHandler.sendEmptyMessage(0); // 0이라는 값을 메세지 핸들러로 메세지를 보낸다.
   }
  });
       
        mProgressHandler = new Handler()
        {
         public void handleMessage(android.os.Message msg)  // 핸들러에서 메세지를 받기 위해서 반드시 이 함수를 구현..
         {
          super.handleMessage(msg);
          if ( mProgress >= 100 )
          {
           mProgressDialog.dismiss();
          }
          else
          {
           mProgress++;
           mProgressDialog.incrementProgressBy(1);     // progressbar를 1씩 증가시킴
           mProgressHandler.sendEmptyMessageDelayed(0, 100);  // 100ms후에 0이라는 값을 보낸다.
          }
         }
        };
    }
   
    @Override
    protected Dialog onCreateDialog(int id)  // showDialog에서 인자로 넘긴 아이이값이랑 동일
    {
     
     switch (id)
     {
  case DIALOG_SIMPLE_MESAGE :
   Log.v("DialogTest", "onCreateDialog DIALOG_SIMPLE_MESAGE!!!!!!!");
   // 다이얼로그를 만들고 그 다이얼로그의 윈도우를 얻어와서 타이틀을 세팅하고 보여줌.
   Dialog d = new Dialog(DialogTest.this);
   Window window = d.getWindow();
   window.setFlags(WindowManager.LayoutParams.FIRST_APPLICATION_WINDOW, WindowManager.LayoutParams.FIRST_APPLICATION_WINDOW);
   d.setTitle("hi");
   d.show();
   return d;
 
  case DIALOG_YES_NO_MESAGE :
   Log.v("DialogTest", "onCreateDialog DIALOG_YES_NO_MESAGE!!!!!!!");
   // AlertDialog.Builder 객체를 생성
   return new AlertDialog.Builder(DialogTest.this)
   .setIcon(R.drawable.icon)
   .setTitle("Yes,No Dlg")                  // 제목
   .setMessage("do you know me?")                // 메세지
   .setPositiveButton(R.string.alert_dialog_ok, new DialogInterface.OnClickListener() {  // OK 버튼 리스너
    public void onClick(DialogInterface dialog, int whichButton)
    {
     /* User clicked OK so do some stuff */
    }
   })
   
   .setNegativeButton(R.string.alert_dialog_cancel, new DialogInterface.OnClickListener() { // cancel 버튼 리스너
    public void onClick(DialogInterface dialog, int whichButton)
    {
     /* User clicked Cancel so do some stuff */
    }
   })
   
   .create();
 
  case DIALOG_CHOICE_MESAGE :
   Log.v("DialogTest", "onCreateDialog DIALOG_CHOICE_MESAGE!!!!!!!");
   // 싱글 혹은 멀티풀 선택 가능
   return new AlertDialog.Builder(DialogTest.this)
    .setIcon(R.drawable.icon)
             .setTitle(R.string.alert_dialog_single_choice)
             .setSingleChoiceItems(R.array.alert_array, 0, new DialogInterface.OnClickListener()
             {
     @Override
     public void onClick(DialogInterface dialog, int which)
     {
      /* user... */
     }
    })
    .setPositiveButton(R.string.alert_dialog_ok, new DialogInterface.OnClickListener()
    {
     @Override
     public void onClick(DialogInterface dialog, int which)
     {
      /* user... */
     }
    })
    .setNegativeButton(R.string.alert_dialog_cancel, new DialogInterface.OnClickListener()
    {
     public void onClick(DialogInterface dialog, int whichButton)
     {
                      /* User clicked No so do some stuff */
     }
    })
    .create();
 
  case DIALOG_PROGRESS_MESAGE :
   Log.v("DialogTest", "onCreateDialog DIALOG_PROGRESS_MESAGE!!!!!!!");
   // Progressbar와 함께 표현한 다이얼로그
   mProgressDialog = new ProgressDialog(DialogTest.this);
   mProgressDialog.setIcon(R.drawable.icon);
   mProgressDialog.setTitle(R.string.alert_dialog_progress);
   mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
   mProgressDialog.setMax(100);
   mProgressDialog.setButton("hide", new DialogInterface.OnClickListener()
   {
    @Override
    public void onClick(DialogInterface dialog, int which)
    {
     /* user... */
    }
   });
   
   mProgressDialog.setButton2(getText(R.string.alert_dialog_cancel), new DialogInterface.OnClickListener()
   {
    @Override
    public void onClick(DialogInterface dialog, int which)
    {
     /* user... */
    }
   });
   
   return mProgressDialog;
   
  }

     return super.onCreateDialog(id);
    }
   
   
}

 

 

 

#. 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"
    >
 <Button
  android:id="@+id/simple"
  android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:text="@string/str_simple"
 />
 <Button
  android:id="@+id/yesNo"
  android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:text="@string/str_yesNo"
 />
 <Button
  android:id="@+id/choice"
  android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:text="@string/str_choice"
 />
 <Button
  android:id="@+id/progress"
  android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:text="@string/str_progress"
 />
</LinearLayout>


#. string.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="hello">Hello World, DialogTest!</string>
    <string name="str_simple">simple_alert</string>
    <string name="str_yesNo">yesNo alert</string>
    <string name="str_choice">choice alert</string>
    <string name="str_progress">progress alert</string>
    <string name="alert_dialog_cancel">cancel</string>
    <string name="alert_dialog_ok">ok</string>
    <string name="alert_dialog_single_choice">single choice</string>
    <string name="alert_dialog_progress">Progress Dialog!</string>
</resources>


#. Arrays.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="alert_array">
 <item>1</item>
 <item>2</item>
 <item>3</item>
 <item>4</item>
</string-array>
</resources>

2010년 3월 30일 화요일

메뉴(Menu) 종류와 정의.

#. 메뉴 종류
  -. 옵션메뉴(Option Menu) : 기기에 붙어 있는 실제 버튼 클릭
  -. 컨텍스트 메뉴(Context Menu) : 메뉴가 연결된 위젯을 화면상에서 터치하고 잠깐동안 떼지않는 동작으로 띠울 수 있음.


#. 옵션메뉴
  -. onCreateOptionsMenu() 메소드 구현함. 인자로는 Menu 인스턴스가 넘어옴
  -. onCreateOptionsMenu() 에서 가장먼저 할일은 상위 클래스(super.onCreateOptionsMenu(menu)) 을 호출해
     Android 프리임웍에서 시스템 관련메뉴 추가(상위클래스 호출후 필요한 메뉴 항목 직접추가 가능)
  -. 액티비티 동작시 메뉴 항목에 대한 설정변경할경우(사용할수없는메뉴 비활성화 등)
    a. 위에서 넘겨받았던 Menu를 보관해두고 사용.
    b. 위의 방법 외에 onPrepareOptionMenu()을 이용하여 메뉴 항목의 상태를 변경한다.
  -. onPrepareOptionMenu()에서 메뉴를 추가할경우 넘겨받은 Menu 인서튼서의 add() 호출
    a. add() 호출하면 그 결과로 MenuItem 인스턴스 넘어옴.
    b. 메뉴 항목에 대한 설정이나 텍스트를 바꾸려면 이때 넘겨받은 인스턴스를 그대로 사용.
  -. 단축키 지정 가능
    a. setAlphabeticShortcut() : 알파벳 단축키
    b. setNumericShortcut() : 숫자 단축키
    c. 메뉴 자체가 알파벳 단축키 지정 방식으로 동작하게 하려면 Menu의 setQwertyMode() = True로.


2010년 3월 29일 월요일

Flipper(플리퍼) 예제

#. 플리퍼 버튼눌렀을시 화면넘기는 예제
  a. 초간단한 예제로 탭 사용하지 않고 화면 넘기기(플리퍼)
  b. 여기서는 버튼 클릭으로 넘기게 했으나 개발자가 충분히 핸들링 가능

-. 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"
>
<Button android:id="@+id/flip_me"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="페이지 넘김"
/>
<ViewFlipper android:id="@+id/details"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textStyle="bold"
android:textColor="#FF00FF00"
android:text="첫번째 페이지"
/>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textStyle="bold"
android:textColor="#FFFF0000"
android:text="두번째 페이지"
/>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textStyle="bold"
android:textColor="#FFFFFF00"
android:text="세번째 페이지"
/>
</ViewFlipper>
</LinearLayout>


-. source
package my.app;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ViewFlipper;

public class Flipper extends Activity {
ViewFlipper flipper;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        flipper = (ViewFlipper) findViewById(R.id.details);

        Button btn = (Button)findViewById(R.id.flip_me);

        btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
flipper.showNext();
}
});

    }
}



#. 동적으로 플리퍼 생성
  a. TabWidget과 유사하게 행 도중에 동적으로 추가할수 있다
  b. 임의의 단어를 가져와 버튼 객체 생성후 모두 ViewFlipper로 추가한다.
  c. 타이머 지정하여 저절로 이동하게 만듬
  d. 애니메이션 효과 사용하였음(내용 방대하므로 기본적인것)

#. 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"
>
<ViewFlipper android:id="@+id/details"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
</ViewFlipper>
</LinearLayout>

#. source
package my.app;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.view.animation.AnimationUtils;
import android.widget.Button;
import android.widget.ViewFlipper;

public class Flipper extends Activity {
ViewFlipper flipper;

static String[] items = {"lorem", "ipsum", "dolor", "sit", "amet",
"consectetuer", "adipiscing", "elit",
"morbi", "vel", "ligula", "vitae",
"arcu", "aliquet", "mollis", "etiam",
"vel", "erat", "placerat", "ante",
"porttitor", "sodales", "pellentesque",
"augue", "purus"};

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        flipper = (ViewFlipper)findViewById(R.id.details);

        // 애니메이션 지정(어디서 나타나고 어디서 사라지는지)
        flipper.setInAnimation(AnimationUtils.loadAnimation(this, R.drawable.push_left_in));
flipper.setOutAnimation(AnimationUtils.loadAnimation(this,R.drawable.push_left_out));

for (String item : items) {
// 임의의 단어를 모두가져와 각자 버튼 생성
Button btn=new Button(this);

btn.setText(item);

// ViewFlipper에 모두추가
flipper.addView(btn,new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
ViewGroup.LayoutParams.FILL_PARENT));
}

flipper.setFlipInterval(2000); // 타이머 설정(일정시간후 자동으로 화면넘김)
flipper.startFlipping(); // 타이머 실행



    }
}

ProgressBar, Tab 동적 기본 예제..

#. 진행상태 표시

  -. 백그라운드 스레드를 사용해 해당작업 처리.
  -. 완료시점 setMax()로 지정, setProgress()로 진행상황 설정(진행상태 확인 getProcess())
  -. 종료시점 명확하지 않을경우 setIndeterminate() 메소드 값 true로 넘겨줌
    => 진행 상황에 관계없이 계속해서 작업 중이라고 표현.


# 탭(Tab) 기본 예제

  -. 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">
<TabHost android:id="@+id/tabhost"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TabWidget android:id="@android:id/tabs"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<FrameLayout android:id="@android:id/tabcontent"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:paddingTop="62px">
<AnalogClock android:id="@+id/tab1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_centerHorizontal="true"
/>
<Button android:id="@+id/tab2"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="단순한 버튼"
/>
</FrameLayout>
</TabHost>
</LinearLayout>


  -. source
package my.app;

import android.app.Activity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.TabHost;

public class Tab extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        TabHost tabs = (TabHost) findViewById(R.id.tabhost);

        tabs.setup();

        // 탭을 사용하기전 반드시 TabHost 인스턴스의 setup()을 호출해얗란다.
        TabHost.TabSpec spec = tabs.newTabSpec("tag1");

        spec.setContent(R.id.tab1); // 내용 불러옴
        spec.setIndicator("시계"); // 탭 글자
        tabs.addTab(spec); // 내용 추가

        spec = tabs.newTabSpec("tag2");
        spec.setContent(R.id.tab2);
        spec.setIndicator("버튼");
        tabs.addTab(spec);

        tabs.setCurrentTab(0); // 기본적으로 표시할 탭

    }
}



# 동적으로 탭 생성
  -. 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">
<TabHost android:id="@+id/tabhost"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TabWidget android:id="@android:id/tabs"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<FrameLayout android:id="@android:id/tabcontent"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:paddingTop="64px">
<Button android:id="@+id/buttontab"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="단순한 버튼"
/>
</FrameLayout>
</TabHost>
</LinearLayout>


   -. source
package my.app;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AnalogClock;
import android.widget.Button;
import android.widget.TabHost;

public class Tab extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        final TabHost tabs = (TabHost) findViewById(R.id.tabhost);

        tabs.setup();

        // 탭을 사용하기전 반드시 TabHost 인스턴스의 setup()을 호출해야한다.
        TabHost.TabSpec spec = tabs.newTabSpec("buttontab");

        spec.setContent(R.id.buttontab);
        spec.setIndicator("버튼");
        tabs.addTab(spec);

        tabs.setCurrentTab(0);

        Button btn = (Button)tabs.getCurrentView().findViewById(R.id.buttontab);
        btn.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
TabHost.TabSpec spec = tabs.newTabSpec("시계");

// 해당하는 탭 내용에 들어갈 위젯 생성하는 기능
spec.setContent(new TabHost.TabContentFactory() {

@Override
public View createTabContent(String tag) {
return (new AnalogClock(Tab.this));
}
});
spec.setIndicator("시계");
tabs.addTab(spec);
}
});


    }
}

2010년 2월 23일 화요일

[android] ListView와 RatingBar 사용하기.

#. ViewWrapper 클래스
package my.app.RateListExample;

public class ViewWrapper {
View base;
RatingBar rate = null;
TextView label = null;

public ViewWrapper(View base) {
this.base = base;
}

RatingBar getRatingBar() {
if (rate == null) {
rate = (RatingBar) base.findViewById(R.id.rate);
}

return rate;
}

public TextView getLabel() {
if (label == null) {
label = (TextView) base.findViewById(R.id.label);
}

return label;
}

}




#. RateList 클래스
package my.app.RateListExample;

public class RateList extends ListActivity {

TextView selection;
String[] items={"lorem", "ipsum", "dolor", "sit", "amet", "consectetuer", "adipiscing", "elit", "morbi", "vel",
"ligula", "vitae", "arcu", "aliquet", "mollis", "etiam", "vel", "erat", "placerat", "ante",
"porttitor", "sodales", "pellentesque", "augue", "purus"};

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

ArrayList<RowModel> list = new ArrayList<RowModel>();

for (String s : items) {
list.add(new RowModel(s));
}

setListAdapter(new CheckAdapter(this, list));
}

private RowModel getModel(int position) { // 레이블로 사용할 텍스트와 함께 별점 상태를 보관
return(((CheckAdapter)getListAdapter()).getItem(position));
}

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
selection.setText(getModel(position).toString());
}

class CheckAdapter extends ArrayAdapter<RowModel> {
Activity context;

public CheckAdapter(Activity context, ArrayList<RowModel> list) {
super(context, R.layout.raterow, list);
this.context = context;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
View raterow = convertView;
ViewWrapper wrapper = null;
RatingBar rate = null;

if (raterow == null) {
// 레이아웃 파일을 사용해 새로운 행 생성
LayoutInflater inflater = context.getLayoutInflater();
raterow = inflater.inflate(R.layout.raterow, null);

// 생성된 View 인스턴스에 ViewWrapper 인스턴스 생성
wrapper = new ViewWrapper(raterow);
raterow.setTag(wrapper);
rate = wrapper.getRatingBar(); // 행마다 들어있는 RatingBar

/*
* 선택된 값을 Intager 형태로 변환하는 메소드
* 변환된 값은 ArrayAdapter 내에서 해당하는 행이 어디에 위치하는지를 가르키는
         *  번호다.
* 행번호를 찾고나면 해당하는 행과 연동된 RowModel을 찾아온다.
* RatingBar에서 새로 선택된 값은 RowModel 인스턴스에 직접 설정한다.
*/
RatingBar.OnRatingBarChangeListener l =
new OnRatingBarChangeListener() {

@Override
public void onRatingChanged(RatingBar ratingBar, float rating,
boolean fromUser) {
Integer myPosition = (Integer) ratingBar.getTag();
RowModel model = getModel(myPosition);

model.rating = rating;

LinearLayout parent = (LinearLayout) ratingBar.getParent();
TextView label = (TextView) parent.findViewById(R.id.label);
label.setText(model.toString());

}
};
} else {
wrapper = (ViewWrapper) raterow.getTag();
rate = wrapper.getRatingBar();
}

RowModel model = getModel(position);
wrapper.getLabel().setText(model.toString());
rate.setTag(new Integer(position));
rate.setRating(model.rating);

return raterow;
}
}

class RowModel {
String label;
float rating=2.0f;

RowModel(String label) {
this.label=label;
}

public String toString() {
if (rating>=3.0) {
return(label.toUpperCase());
}

return(label);
}
}
}