레이블이 [android]인 게시물을 표시합니다. 모든 게시물 표시
레이블이 [android]인 게시물을 표시합니다. 모든 게시물 표시

2015년 12월 10일 목요일

[android]ListVIew 에서 스크롤 이벤트 감지

//리스트뷰에서 스크롤시 view 의 포커스를 없애고 키보드를 닫는 용도로 활용했다.

mListView = (ListView)findViewById(R.id.list_view);

//view에서
mListView.setOnScrollListener(new OnScrollListener(){

@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
// TODO Auto-generated method stub

}

@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {

if(scrollState == OnScrollListener.SCROLL_STATE_FLING){
Log.d("AutoCallService", "onScrollStateChanged()");

hideKeyboardAndFocusOut();
}


}

});


//mListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
mListView.setAdapter(adapter);

//현재 포커스를 가진 뷰의 포커스를 해제하고 키보드를 숨긴다.
private void hideKeyboardAndFocusOut(){

InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);

if(inputManager.isAcceptingText()){
Log.d("", "hideKeyboardAndFocusOut");
View onFocus = getCurrentFocus();
onFocus.clearFocus();
inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}


}

[android] 완료버튼,다음버튼 이벤트감지


viewHolder.count.setOnEditorActionListener(new OnEditorActionListener(){



public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
// IME_ACTION_SEARCH , IME_ACTION_GO, IME_ACTION_DONE, IME_ACTION_NEXT
                                //버튼 상수값
if(actionId == EditorInfo.IME_ACTION_DONE) {
Log.d("AutoCallService", "onEditorAction");
v.clearFocus();
return true;

}
return false;
}

});


TextEdit 객체에 setOnEditorActionListener함수를 호출 하고
파라미터로 OnEditorActionListener 인터페이스 객체를 생성하고 메소드를 오버라이드 해준다.

[android] EditText 포커스 이동 감지

base 어댑터 viewHolder 사용할때 작성해봤다.



viewHolder.count.setOnFocusChangeListener(new OnFocusChangeListener(){

@Override
public void onFocusChange(View v, boolean hasFocus) {
                                 //포커스를 잃을때.
if(!hasFocus) { 

Log.d("AutoCallService", "saveCount");

}
});

[android]EditText 키보드 이벤트 감지

//EditText 객체에서 onKeyDown 메소드를 오버라이드 하여 사용한다.






@Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
   

    if(event.getKeyCode() == KEYCODE_ENTER){
    this.clearFocus();
    }
    Log.d("AutoCallService", "keyCode : "+keyCode+"");
    Log.d("AutoCallService", "event.getKeyCode() : "+event.getKeyCode()+"");
       
    // TODO Auto-generated method stub
    return super.onKeyDown(keyCode, event);
    }

[android]EditText 포커스시 텍스트 전체선택

xml로 정의 할때 해당 EditText 객체 속성에

android:selectAllOnFocus="true" 값을 준다.

[android]EditText 에서 백버튼 이벤트 발생감지

EditText 에서 백버튼을 누르면 키보드 창은 닫히지만 포커스는 사라지지 않는다.

이런 경우를 포함한 여러가지 경우 백버튼 이벤트를 통해 처리해야할 로직이 있다면

//EditText 객체에서 onKeyPreIme 메소드를 재정의한다.

    public boolean onKeyPreIme( int keyCode, KeyEvent event ) {
   
   
    Log.d("AutoCallService", "keyCode : "+keyCode+"");
    Log.d("AutoCallService", "event.getKeyCode() : "+event.getKeyCode()+"");
    switch (event.getAction()) {
   
    case KeyEvent.ACTION_DOWN :
   
    if( event.getAction() == KeyEvent.ACTION_DOWN ) {
    if( keyCode == KeyEvent.KEYCODE_BACK ) {
    this.clearFocus();
   

    Log.d("AutoCallService", "onBackPressed()2");
    }
    }
    break;
   
   
    }
   
return super.onKeyPreIme( keyCode, event );
}

Activity 에서 implements OnEditorActionListener 후


/*@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {

if(event.getAction() == KeyEvent.ACTION_DOWN)
{
Log.i("AutoCallService", event.getKeyCode()+"");

}
// TODO Auto-generated method stub
return false;
}*/

방식으로 하는 경우도 있다. 각각 테스트 해보시길~

[android]사용자 정의 객체를 xml 에 지정하기

public class BackButtonFocusOutEditText extends EditText {

/*private OnBackPressListener _listener;*/



public BackButtonFocusOutEditText(Context context, AttributeSet attrs) {

super(context, attrs);
// TODO Auto-generated constructor stub
}


EditText 객체를 생성하고 생성자를 AttributeSet 인자를 받는거로 셋팅하고




<home.et.AutoCallManager.BackButtonFocusOutEditText android:id="@+id/edit_phone_name_edt"
            android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:hint="@string/edit_phone_name_edt"
        android:inputType="text"
        android:layout_weight="20"/>

위와 같은방법으로 작성하면 된다.

2015년 12월 9일 수요일

[android]activity에서 외부 activity(전화번호부) 실행후 데이터 가져오기



//인텐트 플레그 상수 
static final int PICK_CONTACT_REQUEST = 1; 
//액티비티 실행후 반환 값 상수 -1에 주의.....
static final int RESULT_OK = -1;

어떤 외부액티비티를 실행하는지에대한 여부를 알아야하기때문에 
static final int PICK_CONTACT_REQUEST = 1;  를정의한다.


//requestCode 는 액티비티 실행시 넘겨준 상수값이 그대로 넘어온다.
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
//
  switch (requestCode) {

  // 1일경우 본인은 액티비티 실행시 상수로 PICK_CONTACT_REQUEST 를 넘겨줬다.
case PICK_CONTACT_REQUEST:

  // 정상적인 연결종료시 -1이 반환된다.
if(resultCode == RESULT_OK){
//커서객체를 통해 질의
Cursor cursor = getContentResolver().query(data.getData()
,new String[]{ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,ContactsContract.CommonDataKinds.Phone.NUMBER}
,null
,null
,null);
cursor.moveToFirst();
String phoneNameVal  = cursor.getString(0); //이름
String phoneNumberVal = cursor.getString(1); //번호
cursor.close();
TextView phoneName = (TextView)findViewById(R.id.edit_phone_name_edt);
phoneName.setText(phoneNameVal);
TextView phoneNumber = (TextView)findViewById(R.id.edit_phone_num_edt);
phoneNumber.setText(phoneNumberVal);
}
break;

default:
break;
}

[android]전화번호부 열기

//스위치 문으로 버튼에 onClick 이벤트일때 버튼 아이디가 show_num_list_btn 일경우

전화번호 를 연다.

public void onClick(View view){

switch (view.getId()){

//전화번호부 열기버튼
case R.id.show_num_list_btn : {

Intent ContactsIntent = new Intent(Intent.ACTION_PICK);
ContactsIntent.setData(ContactsContract.CommonDataKinds.Phone.CONTENT_URI);
startActivityForResult(ContactsIntent, PICK_CONTACT_REQUEST); // 사용자 정의 상수

//onActivityResult 에서 PICK_CONTACT_REQUEST 를 통해 어떤액티비티인지 참고한다.

break;
}

[android]baseAdapter에서 viewHolder 사용하기

public class AutoCallBaseAdapter extends BaseAdapter{

....


//저장할 객체 innerClass 로 선언
class ViewHolder{
//TextView _id;
TextView phoneName;
TextView phoneNum;
BackButtonFocusOutEditText count;
CheckBox checkBox;

}

public View getView(int position, View convertView, ViewGroup parent) {

View itemLayout = convertView;
.....


ViewHolder viewHolder = null;

//성능향상을 위해
if(itemLayout == null){
//리소스로부터 레이아웃을 얻어온다
itemLayout = mLayoutInflater.inflate(R.layout.list_view_layout, null);



// 만든 레리아웃으로부터 veiw 객체를 추출한다.
viewHolder = new ViewHolder();



//viewHolder._id = (TextView)itemLayout.findViewById(R.id._id);
viewHolder.phoneName = (TextView)itemLayout.findViewById(R.id.phoneName);
viewHolder.phoneNum = (TextView)itemLayout.findViewById(R.id.phoneNum);
viewHolder.count = (BackButtonFocusOutEditText)itemLayout.findViewById(R.id.count);
viewHolder.checkBox = (CheckBox)itemLayout.findViewById(R.id.checkbox);

/*viewHolder.count.setOnBackPressListener(new OnBackPressListener()
   {
       @Override
       public void onBackPress()
       {
        Log.d("AutoCallService", "onBackPress");
       
       }
   });*/

itemLayout.setTag(viewHolder);

//뷰홀더가 정의되어 있을경우 는
}else{

viewHolder = (ViewHolder)itemLayout.getTag();

}

// 데이터를 셋팅한다.
//viewHolder._id.setText(mData.get(position).phoneId);
viewHolder.phoneName.setText(mData.get(position).phoneName);
viewHolder.phoneNum.setText(mData.get(position).phoneNum);
viewHolder.count.setText(mData.get(position).count);

[android] ListView에서 editText 커서이동 오류

ListView 에서 로우마다 EditText 필드가 존재 할경우
스크롤이나 텍스트입력이 있고없고에 따른 포커스가 지맘대로 일때가있다.


AndroidManifest.xml 에서 <activity> 속성에 android:windowSoftInputMode="adjustPan"

추가해주면 해결될수 있다.

[android] ListView CheckBox 스크롤시 문제점

리스트 로우 마다 checkBox 를 넣어야 할때가 있는데 스크롤로 인해 체크된 아이템이 화면 밖으로 나갓다 들어올시 어댑터의 getView 등의 함수(화면을 다시 그리는...)가 호출되면서 체크박스가 제대로 체크가 안되는 경우가 있다.

여러가지 해결방법이 있지만

난 각각의 아이템 객체에 isChecked 변수를 활용해서 해결해 보았다.

AutoCallServiceVo.class

public class AutoCallServiceVo {
String phoneNum;
String phoneName;
String count;
String phoneId;
        //추가된 변수
boolean  isChecked;


//어댑터
AutoCallBaseAdapter.class

public class AutoCallBaseAdapter extends BaseAdapter{

.....


public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub



//
View itemLayout = convertView;

//


//리스너에서 사용할 포지션 변수 (그냥 position 값을 넣으면 컴파일 에러)
final int checkBoxPosition = position;

ViewHolder viewHolder = null;


if(itemLayout == null){

itemLayout = mLayoutInflater.inflate(R.layout.list_view_layout, null);




viewHolder = new ViewHolder();



//viewHolder._id = (TextView)itemLayout.findViewById(R.id._id);
viewHolder.phoneName = (TextView)itemLayout.findViewById(R.id.phoneName);
viewHolder.phoneNum = (TextView)itemLayout.findViewById(R.id.phoneNum);
viewHolder.count = (BackButtonFocusOutEditText)itemLayout.findViewById(R.id.count);
viewHolder.checkBox = (CheckBox)itemLayout.findViewById(R.id.checkbox);



itemLayout.setTag(viewHolder);

//뷰홀더가 정의되어 있을경우 는
}else{

viewHolder = (ViewHolder)itemLayout.getTag();

}

// 데이터를 셋팅한다.
//viewHolder._id.setText(mData.get(position).phoneId);
viewHolder.phoneName.setText(mData.get(position).phoneName);
viewHolder.phoneNum.setText(mData.get(position).phoneNum);
viewHolder.count.setText(mData.get(position).count);




//체크박스 클릭 이벤트
viewHolder.checkBox.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Log.d("AutoCallService", "checkClick");

AutoCallServiceVo checkViewItem = (AutoCallServiceVo)getItem(checkBoxPosition);

Log.d("AutoCallService", "checkItem : " + checkViewItem.getPhoneName());

//체크 안되어 있는 경우
if(checkViewItem.isChecked){

mData.get(checkBoxPosition).isChecked = false;

//체크가 되어 있는 경우
}else{

mData.get(checkBoxPosition).isChecked = true;


}
//데이터 변경 알림
notifyDataSetChanged();

}


});


//로우별 isChecked 값에 따른 체크상태를 표시
viewHolder.checkBox.setChecked(mData.get(position).isChecked);


//값이 다 셋팅된 view 객체를 반환한다.
return itemLayout;
}


......


[android] 데이터베이스 싱글톤 구현(db생성)



public class AutoCallServiceDBManager {
static final String DB_AUTOCALL = "AutoCall.db";
static final String TABLE_AUTOCALL = "AutoCall";
static final int DB_VERSION = 1;

Context mContext = null;


private static AutoCallServiceDBManager autoCallDBManager = null;
private   SQLiteDatabase mdatabase = null;


//외부에서 객체생성을 막기 위해 생성자를 private으로 선언하였다.
        //액티비티에서 oncreate 시 getInstance 를 호출 하게하여 처음 DB를 생성하고
        //연결후 이후는

private AutoCallServiceDBManager(Context context) {
// TODO Auto-generated constructor stub
mContext = context;

//DB생성 및 연결
mdatabase = context.openOrCreateDatabase(DB_AUTOCALL, Context.MODE_PRIVATE ,null);

//테이블과 컬럼 생성
mdatabase.execSQL("CREATE TABLE IF NOT EXISTS " + TABLE_AUTOCALL +
"(" + "_id INTEGER PRIMARY KEY AUTOINCREMENT, " +
"phoneName TEXT, " +
"phoneNum TEXT, " +
"count INTEGER default 1 ); ");

}

//내부에서 생성자를 인스턴스화 하여 반환함.
public static AutoCallServiceDBManager getInstance(Context context){

if(autoCallDBManager == null){
autoCallDBManager = new AutoCallServiceDBManager( context );
}

return autoCallDBManager;
}

//select 문 전용 함수
public Cursor query( String [] columns, String selection, String[] selectionArgs, String groupBy,
String having, String orderBy ){

return mdatabase.query(TABLE_AUTOCALL, columns, selection, selectionArgs, groupBy, having, orderBy);

}

//데이터 추가
public long insert(ContentValues addRowValue){

Log.d("AutoCallService", "insert()");
return mdatabase.insert(TABLE_AUTOCALL, null, addRowValue);

}
//데이터 전체 삭제
public void deleteAll(){
mdatabase.execSQL(" delete from AutoCall;");
}


}

2015년 11월 5일 목요일

[android] 이클립스 Error in an XML file: aborting build.

xml 파일 생성후 리소스 파일 작성중

xml 빌드가 안되서 R.java 에 클래스랑 리소스 태그 참조 변수가 생성이 안되는 경우

project -> clean  에서 해당 프로젝트를 클린해주면 된다.

프로젝트를 실행할때 xml 이 빌드 되기 때문에 실행했던 프로젝트의 xml 을수정할경우 clean 을 해주어야한다.



2015년 10월 30일 금요일

[android] Buttons in button bars should be borderless 버튼 에러 대처법

버튼에 경계선이 없어야 한다는 에러.

무시하거나

버튼에 style="?android:attr/borderlessButtonStyle"  속성을 추가한다.


[android] 안드로이드 string.xml 에서 특수문자 사용하기

<string name="view3-1">view3<![CDATA["-"]]>1</string>


<![CDATA[" 여기다 입력해면 된다. "]]>

2015년 10월 18일 일요일

[android] sdk adt 설치후 일어나는 이클립스 오류및 프로젝트 버전 설정

1. appcompat_v7 오류

 설치후 res value 에서 오류가 나는 경우

appcompat 프로젝트 마우스 우클릭 -> properties -> Android

Project Build Target 에서 최신 Android 6.0 을 선택 apply -> ok

(안드로이드 프로젝트에서 레이아웃이나 기타 UI 등등등 에서 appcompat 프로젝트를
참조한다고 함. 버전이 낮을 경우  resource 를 찾지 못해서 에러가 발생할수 있다.)


2. 이클립스 에뮬레이터로 프로젝트 실행시  나는 오류

C:\User\Administrator\.android\adv\프로젝트명.avd    루트에서 config.ini 를 확인한다.




3. 안드로이드 프로젝트 버전 설정 (추천)


 new - >  other ->  Android Application Project 선택후 next 클릭

 파란부분은 설치될 앱 이름과 개발자가 볼 프로젝트이름 , 패키를 지정 
(앱이름과 프로젝트 이름은 통일하는 게 좋다 )


빨간색 부분이 중요한데 

Minimum Required SDK : 최소 요구 sdk 를 설정한다.

target SDK :  실행될 단말기에서 사용할 sdk 버전이다

compile with : 실행될 단말기에서 컴파일할 sdk 버전

theme : 테마설정

자유롭게 선택이 가능하지만

첫번째 sdk 설정은 sdk 최소요구 레벨이고 target SDK 는 상위버전 디바이스에서도 하위버전 sdk 를 실행하게 해주는 값이다 최신안드로아디 api로 개발된 기술이 있을경우 타겟을 설정해주면 되지만 버전이 낮은 디바이스에서는 해당기능은 실행이 되지 않는다.

세번째는 컴파일에 사용할 라이브러리 sdk 를 설정하는 부분인데 
여러버전에서 호환하는 부분이 가장 중요하므로

사용성이 가장 많은 젤리빈 4.x 버전때로 minimum 과 컴파일 값을 주고 가능하면 target sdk 값도 동일하게 마춰주는게 좋지만 사용하고자하는 라이브러리가 없을수도 있으니 알아서 셋팅 하자 필요에 따라서....
           

* minimum과 compile 은마춰주 는게 좋다.
* 주기적으로 최신 api 버전 라이브러리로 변경적용후 디플리케이트 된 API 를 확인후
* 버전에 따라 처리한다. (변경된 함수로 기능 적용, 함수가 없을경우 기능 포기 또는 예외처리)
* 다시 원레 라이브러리로 적용시킨다.






[OS]리눅스서버 WAS 관련 권한 관리

[Best Practice] Linux 서버 WAS 권한 체계 구축 가이드 리눅스 환경에서 다수의 운영자가 WAS(Tomcat, Nginx 등)를 공동 관리할 때 발생하는 권한 꼬임(Permission Denied) 문제를 방지하기 위한 표준 설정...