2011.03.09 14:47
                
               EditText의 경우, 한글 기준하여 Byte값을 이와 같이 TextWatcher  리스너를 구현하여 계산할 수 있다. 
               또한, 메세지 어플을 제작할 경우 80Byte 한계 치를 조정 할 수도 있다.

   ( 리스너에서 EditText 값을 변경 하려는 경우 StackOverFlow가 발생하여 ANR이 뜨게 되니 
     주의 하자. )
    
   private EditText mContent;
   private TextView mByte;
   
   ...

               //Byte 계산을 위한 EditText 이벤트
private TextWatcher editEvent = new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if(mContent.isFocusable())
{
try
{
byte[] bytetext = mContent.getText().toString().getBytes("KSC5601");
mByte.setText(Integer.toString(bytetext.length)+" Byte");
}catch(Exception ex){}
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void afterTextChanged(Editable s) {
String after_text = s.toString();
try
{
byte[] getbyte = after_text.getBytes("KSC5601");
if(getbyte.length > 80)
{
s.delete(s.length()-2, s.length()-1);
}
}catch (Exception e) {}
}
};

                ...
신고
Posted by 구름같은사나이
2010.11.23 12:54

...

mAdapter.sort(new ItemInfoSort());   //Adapter의 sort 함수 이용.

...

private static final Collator sCollator = Collator.getInstance();  //Collator 객체 생성
...

//Adapter에 들어가는 List에 대한 자료형 으로 정렬 ( a, b의 순서를 바꾸면 역정렬 )
static class ItemInfoSort implements Comparator<AllModel_Security_Item> {            
        public final int compare(AllModel_Security_Item a, AllModel_Security_Item b) {
            return sCollator.compare(a.getName(), b.getName());  
        }
}
신고
Posted by 구름같은사나이
2010.11.22 15:24
    

 일반적인 Toast에 질릴 때, 다음과 같이 Custom Toast를 만들어 보자.

Toast mToast = new Toast (this);
...
    //view layout inflate
    View view = View.inflate(this, R.layout.toast, null); 
TextView text = (TextView)view.findViewById(R.id.text_toast);
ImageView image = (ImageView)view.findViewById(R.id.toast_image);
text.setText(getText(R.string.setting_toast).toString()+Integer.toString(size));
image.setBackgroundResource(R.drawable.toast_list);
//toast에 적용
                mToast.setView(view);
mToast.setGravity(Gravity.CENTER, 0, 220);
mToast.setDuration(Toast.LENGTH_SHORT);
mToast.show();
            ...
신고
Posted by 구름같은사나이
2010.11.22 15:19

AndroidManifest.xml 상에서, ListPreference 가 정의된 Activity Tag에 다음과 같이 넣는다.

android:theme="@android:style/Theme.Light"
신고
Posted by 구름같은사나이
2010.11.15 10:01

Dialog를 상속하여 Custom Dialog를 만들시에, 아래와 같이 넣어주면, Dialog Title바가 생기지 않는다. 
주의 ) setContentView 메소드가 불리기 전에 호출 되어야 한다.



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

    this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,       
                                    WindowManager.LayoutParams.FLAG_FULLSCREEN);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);

this.setContentView(R.layout.setting_app_pwd_dialog_layout);

...

}
신고
Posted by 구름같은사나이
2010.11.05 13:24
   



안드로이드 어플리케이션에 구글 애드센스 광고 추가하는 방법 입니다. 
WebView를 이용하여 구현이 가능하네요 ^^;
아래 loadUrl의 파일 경로는 assert 폴더를 이용하면 되겠습니다.


googleadsense.html
<html>
<body>
 //이부분에 script 코드를 삽입 ( 애드센스에서 받은 javascript 코드 )
</body>
</html>


testcode.java
 public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mWeb=(WebView)findViewById(R.id.web);
        
        mWeb.getSettings().setJavaScriptEnabled(true);
        mWeb.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
        mWeb.loadUrl("file:///android_asset/googleadsense.html");
        mWeb.setWebViewClient(new HelloWebViewClient());
    }
    class HelloWebViewClient extends WebViewClient
    {
     @Override
     public boolean shouldOverrideUrlLoading(WebView view, String url) {
     view.loadUrl(url);
     return true;
     }
    }
신고
Posted by 구름같은사나이
2010.10.20 11:27

어제 다이얼로그 때문에 삽질을 좀 많이 한것 같다. 다시 똑같은 실수를 범하지 않으려 한번 써본다.
다이얼로그를 만들시에, showDialog 메소드를 쓰는 경우도 있고, 아니면 다음과 같이 바로 생성 하기도 한다. 

다이얼로그 생성 1 )
...

AlertDialog.Builder dialog=new AlertDialog.Builder(this);
        dialog.setTitle(getText(R.string.alter_title))
     .setMessage(getText(R.string.alter_message))
             .setPositiveButton(getText(R.string.ok), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
 //onClick-Task
}
});
        dialog.show();

...

showDialog 메소드를 이용시, onCreateDialog 메소드를 Override 한 후에, showDialog 메소드를 통해서 불러온다.
 ( 여러개의 다이얼로그가 필요할 시에 유용한듯 - switch문을 만들어 활용 가능)
하지만, 여기서 주의 할 점이 생긴다. showDialog 메소드를 이용하여 생성된 다이얼로그는, 이후에 다시 showDialog 메소드를 이용하면, onCreateDialog 메소드를 타지 않는다. Activity 생성 후, showDialog 메소드 호출시, 단 한번만 onCreateDialog 메소드를 탄다는 것이다. 

그렇다면 지속적으로 onCreateDialog를 타게 하고 싶다면 어떻게 해야 할까? 
removeDialog 메소드를 이용하면 된다. 
만들어 졌던 Dialog를 removeDialog 메소드를 이용해서 지우고 나면, 이후에 다시 onCreateDialog를 타게 된다. 


다이얼로그 생성 2 )
...

@Override
protected Dialog onCreateDialog(int id) {
return new AlertDialog.Builder(Instu_testActivity.this)
.setTitle(getText(R.string.alter_title))
.setMessage(getText(R.string.alter_message))
.setPositiveButton(getText(R.string.ok), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//onClick-Task
}
}).create();
}

...

@Override
public void onClick(View view)
{
showDialog(0);   < - 단 한번만, onCreateDialog를 호출 하고 그 뒤로는 호출 하지 않는다.  즉, 계속해서 버튼을 호출 해도 
  한번 생성된 다이얼로그는 다시 생성되지 않는다. removeDialog를 호출해야 한다.
}

....


신고
Posted by 구름같은사나이
2010.10.18 15:52


ProgressDialog를 사용하다 보면 백그라운에서 작업 할 상황이 있고, 포그라운드 (View) 에서 작업 할 상황이 생긴다. 

이러한 상황이 생겼을 경우, 각 상황에 맞게 분리하는 작업으로 AsyncTask를 이용하면 편리하다. 

---------------------------------------------------------------------------------------------------------------------

class Test extends AsyncTask<String, Integer, Integer>
{
String[] text;
int count; 
           
@Override
protected void onPreExecute() {         
                       //작업을 시작하기전 수행 된다. View 작업 수행              
super.onPreExecute();
Toast.makeText(Instu_testActivity.this, "작업을 시작합니다.", Toast.LENGTH_SHORT);
mDialog.show();
}
@Override 
protected void onPostExecute(Integer result) {     
        //작업을 끝내고 나서 수행 된다. View 작업 수행
super.onPostExecute(result);
Toast.makeText(Instu_testActivity.this, "작업이 끝났습니다.", Toast.LENGTH_SHORT);
mDialog.dismiss();
}
@Override
protected void onProgressUpdate(Integer... values) {
                        //doInBackground 메소드에 있는,  publishProgress 메소드에 의해 불려 진다. 
                        //여기서는 계속해서 progressdialog의 수를 증가 시켜주고, params로 인해 받아온 string값을 
            //message에 보여줌.  
super.onProgressUpdate(values);
mDialog.setProgress(values[0]);
if(values[0]%10 == 0)
{
mDialog.setMessage(text[values[0]/10]);
}
}
@Override
protected Integer doInBackground(String... params) {
                        //Background 작업 수행
text=params;
for(int i=0; i<mDialog.getMax(); i++)
{
try
{
Thread.sleep(500);
}catch(Exception ex){}
this.publishProgress(i);
}
return null;
}
}

.........

mDialog=new ProgressDialog(this);  
    mDialog.setMax(100);
mDialog.setTitle("ProgressDialog Test");
mDialog.setMessage("Test");
mDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);   //ProgressDialog.STYLE_SPINNER
new Test().execute("1","2","3","4","5","6","7","8","9","10");


신고
Posted by 구름같은사나이
2010.10.18 15:10

ProgressDialog 때문에 잠시(?) 고생한 적이 있었다. 

Dialog가 진행중, Back Key가 먹지 않는 현상이 있었는데, 아래와 같이 인자값이 'cancelable'이 false로 지정되어 있었기 때문이다. 

이런 경우, Back Key 이후의 동작을 구현하기 위해서는, 'DialogInterface.OnCancelListener'를 개별적으로 구현해 주어야 한다. 

소스 코드상의 onKeyDown 메소드를 구현해도 다이얼로그 중에는 먹히지 않는다. 개별적인 View(?)로 취급하는 것 같다. 


show(Context context, CharSequence title, CharSequence message, boolean indeterminate, 
boolean cancelable)

show(Context context, CharSequence title, CharSequence message, boolean indeterminate, 
            boolean cancelable, DialogInterface.OnCancelListener cancelListener)
신고
Posted by 구름같은사나이
2010.10.18 13:53



1) ImageFile - 3개의 상태 ( 눌려 졌을 때, 포커스 갔을 때, 기본 )에 대한 이미지 파일을 넣는다.

   /drawable/no_normal , no_press , no_focus 3개의 이미지를 넣는다.

2) XML -  다음과 같이 3개의 상태 ( 눌려 졌을 때, 포커스 갔을 때, 기본 )에 대해 drawable 폴더에 정의 한다.
 
  /drawable/button.xml

<?xml version="1.0" encoding="UTF-8"?>
<selector  xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" 
          android:drawable="@drawable/no_press" />
    <item android:drawable="@drawable/no_normal" />
    <item android:state_focused="true" 
          android:state_pressed="false"
          android:drawable="@drawable/no_focus" /> 
</selector>

  /layout/test_layout.xml

<ImageView android:id="@+id/test" 
  android:layout_height="112sp" 
  android:layout_width="112sp" 
  android:layout_marginTop="7sp" 
  android:layout_gravity="center" 
  android:background="@drawable/button">
</ImageView>

3) JAVA - 정의한 ImageView 에 해당되는 ClickListener를 만들고, onClick함수를 Override 한다.
신고
Posted by 구름같은사나이

티스토리 툴바