2011년 12월 13일 화요일

Dialog 내용 주기적으로 업데이트하기

다이얼로그 내용을 주기적으로 업데이트해야 할 필요가 생겼다.

showDialog() 함수로 다이얼로그를 생성해서 보여줄 수 있다.
다이얼로그가 떠있는 상태에서 showDialog() 함수를 부르면 onCreateDialog() 함수 대신 onPrepareDialog() 함수가 불린다.

onPrepareDialog() 함수에 다이얼로그 내용 업데이트하는 코드를 작성하고 주기적으로 showDialog() 함수를 주기적으로 불러주면 된다.

예제: 다이얼로그에 count 값을 표시하고 1초 마다 count 값을 하나 올리고 다이얼로그 내용을 업데이트하는 코드

File: custom_dialog.xml

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

    <TextView
        android:id="@+id/Message"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        ></TextView>

</LinearLayout>
File: DialogUpdateTest.java


import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.TextView;

/**
 * DialogUpdateTest
 */
public class DialogUpdateTest extends Activity {
 
 private final static int UID_UPDATE_DLG_TEST = 0;
 private final static int DLG_TEST = 0;
 private static int count = 0;
 
 private Handler handler = new Handler() {

  @Override
  public void handleMessage(Message msg) {
   
   switch (msg.what) {
   case UID_UPDATE_DLG_TEST:
    showDialog(DLG_TEST);
    handler.sendEmptyMessageDelayed(UID_UPDATE_DLG_TEST, 1000);
    break;
   default:
    break;
   }
   
   super.handleMessage(msg);
  }
 };

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  
  showDialog(DLG_TEST);
 }

 @Override
 protected void onDestroy() {
  super.onDestroy();
  
  removeDialog(DLG_TEST);
  handler.removeCallbacksAndMessages(null);
 }



 @Override
 protected Dialog onCreateDialog(int id, Bundle args) {
  
  switch (id) {
  case DLG_TEST:
  { 
   AlertDialog.Builder builder = new AlertDialog.Builder(this);
   
   LayoutInflater inflater = getLayoutInflater();
   View view = inflater.inflate(R.layout.custom_dialog, null);
   builder.setView(view);
   
   builder.setTitle("Title");
   
   builder.setOnCancelListener(new DialogInterface.OnCancelListener() {
    @Override
    public void onCancel(DialogInterface dialog) {
     dialog.dismiss();
     removeDialog(DLG_TEST);     
     handler.removeMessages(UID_UPDATE_DLG_TEST);
    }
   });
   
   handler.sendEmptyMessageDelayed(UID_UPDATE_DLG_TEST, 1000);
   
   return builder.create();
  }
  default:
   break;
  }
  
  return super.onCreateDialog(id, args);
 }

 @Override
 protected void onPrepareDialog(int id, Dialog dialog, Bundle args) {
  
  switch (id) {
  case DLG_TEST:
  {
   TextView tv = (TextView)dialog.findViewById(R.id.Message);
   tv.setText("count:" + (count++));
   break;
  }
  default:
   break;
  }
  
  super.onPrepareDialog(id, dialog, args);
 }
}

댓글 없음:

댓글 쓰기