//리스트뷰에서 스크롤시 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);
}
}
2015년 12월 10일 목요일
[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);
}
@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: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;
}*/
방식으로 하는 경우도 있다. 각각 테스트 해보시길~
이런 경우를 포함한 여러가지 경우 백버튼 이벤트를 통해 처리해야할 로직이 있다면
//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"/>
위와 같은방법으로 작성하면 된다.
/*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) {
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;
}
전화번호 를 연다.
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);
....
//저장할 객체 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"
추가해주면 해결될수 있다.
스크롤이나 텍스트입력이 있고없고에 따른 포커스가 지맘대로 일때가있다.
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;
}
......
여러가지 해결방법이 있지만
난 각각의 아이템 객체에 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 을 해주어야한다.
xml 빌드가 안되서 R.java 에 클래스랑 리소스 태그 참조 변수가 생성이 안되는 경우
project -> clean 에서 해당 프로젝트를 클린해주면 된다.
프로젝트를 실행할때 xml 이 빌드 되기 때문에 실행했던 프로젝트의 xml 을수정할경우 clean 을 해주어야한다.
2015년 10월 30일 금요일
[android] Buttons in button bars should be borderless 버튼 에러 대처법
버튼에 경계선이 없어야 한다는 에러.
무시하거나
버튼에 style="?android:attr/borderlessButtonStyle" 속성을 추가한다.
무시하거나
버튼에 style="?android:attr/borderlessButtonStyle" 속성을 추가한다.
[android] 안드로이드 string.xml 에서 특수문자 사용하기
<string name="view3-1">view3<![CDATA["-"]]>1</string>
<![CDATA[" 여기다 입력해면 된다. "]]>
<![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과 compile 은마춰주 는게 좋다.
* 주기적으로 최신 api 버전 라이브러리로 변경적용후 디플리케이트 된 API 를 확인후
* 버전에 따라 처리한다. (변경된 함수로 기능 적용, 함수가 없을경우 기능 포기 또는 예외처리)
* 다시 원레 라이브러리로 적용시킨다.
설치후 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 를 확인후
* 버전에 따라 처리한다. (변경된 함수로 기능 적용, 함수가 없을경우 기능 포기 또는 예외처리)
* 다시 원레 라이브러리로 적용시킨다.
피드 구독하기:
글 (Atom)
[OS]리눅스서버 WAS 관련 권한 관리
[Best Practice] Linux 서버 WAS 권한 체계 구축 가이드 리눅스 환경에서 다수의 운영자가 WAS(Tomcat, Nginx 등)를 공동 관리할 때 발생하는 권한 꼬임(Permission Denied) 문제를 방지하기 위한 표준 설정...
-
수십대의 서버에 특정 쉘을 실행한다거나 파일을 수정해야할경우 호스트 입력 아이디 입력 패스워드 입력은 여간 짜증나는일이 아닐수 없다. 이를 한방에 해주는 방법 teraterm 를 설치한다( putty 는 버리자 ) 예를 들면 19...
-
[Best Practice] Linux 서버 WAS 권한 체계 구축 가이드 리눅스 환경에서 다수의 운영자가 WAS(Tomcat, Nginx 등)를 공동 관리할 때 발생하는 권한 꼬임(Permission Denied) 문제를 방지하기 위한 표준 설정...
-
pom.xml <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId...
