2017.03.07 04:59


Android Studio 에서 Android Version N 이상의 모바일단말을 구동시에 아래와 같은 에러가 발생하는경우 JDK 의 버전을 최신으로 업데이트 해주어야 한다.


Error:(1, 1) A problem occurred evaluating project ':app'.

java.lang.UnsupportedClassVersionError: com/android/build/gradle/AppPlugin : Unsupported major.minor version 52.0


# 문제해결 방법

Download latest java jdk http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

In Android Studio , go to File > Project Structure > SDK Location > select JDK Location path to point to the new jdk installed (Ex: C:\Program Files\Java\jdk1.8.0_111 )


저작자 표시
신고


Posted by injunech
2017.03.05 10:30


Android Studio 단축키 Eclipse와 똑같이 설정하기


어쩔수 없이 안드로이드 스튜디오를 쓰는데, 역시 이전에 쓰던 버릇을 고치기가 쉽지 않다.
다른건 어쩔수 없다 쳐도 단축키는 바꿀수가 있는데...


"File > Settings ... " 메뉴로 가서...


"Keymap > Eclipse" 를 지정하면 이클립스에서 사용하던 단축키와 동일하게 바꿔 준다.

저작자 표시
신고


Posted by injunech
2017.02.27 19:06


안드로이드 화면을 그리는 xml 에서 특수문자를 사용하면 아래와 같은 에러 메시지가 발생함을 보실수 있습니다.


[잘못된 예]

   <TextView

       android:layout_width="wrap_content"

       android:layout_height="wrap_content"

       android:text="TEST & CHAR"

     />


[에러 메시지]

 Multiple annotations found at this line:

- The entity name must immediately follow the '&' in the entity reference.

- [I18N] Hardcoded string "HOME & TECH", should use @string resource


특수문자를 사용하기 위해서는 string에 선언해 놓고 불러서 쓰는 방법이 있습니다만 귀찮은 관계로 유니코드형태로 입력을 해보도록 하겠습니다. 특수문자의 유니코드를 알기 위해서는 구글링링을 하면 됩니다. 하지만 저는 또한 귀찮은 관계로 컴퓨터에 내장된 프로그램을 이용해서 찾아보도록 하겠습니다.


[해결 방법]

시작버튼>실행>charmap 입력





원하는 특수문자 선택




& 같은 경우는 U+0026: Ampersand 라고 표시됨을 볼수 있습니다.

3.  이제 xml 로 돌아가서

 역슬래시 0026 --> \u0026 로 입력을 해주면 됩니다.



[특수문자 사용한 xml 예시]

     <TextView

         android:layout_width="wrap_content"

         android:layout_height="wrap_content"

         android:text="HOME \u0026 TECH"

      />



출처: http://al02000.tistory.com/4 

저작자 표시
신고


Posted by injunech
2017.02.21 21:15


View 절대 좌표값 구하는 방법


View.getLocatioinOnScreen(int[]);

위와 같은 함수를 사용하면 전체 스크린상의 절대 위치의 좌표를 구할수 있다.

예시로 아래와 같이 사용하면 된다.


 public boolean chkTouchInside(View view, int x, int y) {
 int[] location = new int[2];
 view.getLocationOnScreen(location);
 if (x >= location[0]) {
  if (x <= location[0] + view.getWidth()) {
   if (y >= location[1]) {
    if (y <= location[1] + view.getHeight()) {
     return true;
    }
   }
  }
 }
 return false;
} 


저작자 표시
신고


Posted by injunech
2017.02.19 01:07


Color 지정방법에 대한 다양한 방법 소개


You can use various functions from the Color class to get the same effect of course.

  • holder.text.setTextColor(Color.RED);

  • Color.parseColor (Manual) (like LEX uses)

    text.setTextColor(Color.parseColor("#FFFFFF"));
  • Color.rgb and Color.argb (Manual rgb) (Manual argb) (like Ganapathy uses)

    holder.text.setTextColor(Color.rgb(200,0,0));
    holder.text.setTextColor(Color.argb(0,200,0,0));
  • And of course, if you want to define your color in an XML file, you can do this:

    <color name="errorColor">#f00</color>

    because the getColor() function is deprecated1, you need to use it like so:

    ContextCompat.getColor(context, R.color.your_color);
  • You can also insert plain HEX, like so:

    myTextView.setTextColor(0xAARRGGBB);

    Where you have an alpha-channel first, then the color value.

Check out the complete manual of course, public class Color extends Object.


https://developer.android.com/reference/android/graphics/Color.html#parseColor(java.lang.String)



저작자 표시
신고


Posted by injunech
2016.10.23 23:16



Button의 눌림 효과

기존 버튼은 백그라운드로 이미지를 넣게되면 눌림효과가 사라진다.

그래서 백그라운드를 넣어서 버튼을  꾸미게되면 그에따라 눌렸을 경우의 이미지를 준비해야한다.

 

버튼의 눌렸을 경우의 이벤트 xml

button_event.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/눌렸을 경우 이미지"/>

    <item android:drawable="@drawable/기본 이미지"/>

</selector>

 

버튼을 사용하는 xml

        <Button

            android:id="@+id/time_back"

            android:layout_width="fill_parent"

            android:layout_height="fill_parent"

            android:background="@layout/button_event"

            android:text="취소" />

 

이 처럼 간단하게 사용한다. 하지만 이미지뷰를 사용할경우는 조금 할 일이 많다.

버튼의 직사각형을 벋어나 다양한 모양으로 이미지를 사용할경우에 이미지뷰를 이용해서 버튼을 만든다. (버튼 처럼 만든다.)

이미지 버튼이 있지만 이미지버튼은 버튼 안에 이미지가 들어가는 형태로 거의 사용하지 않는다.

 





ImageView의 눌림 효과

이미지를 버튼으로 이용하였을 경우의 소스이다.

이미지의 변화가 시각적으로 나타나야되기 때문에 클릭리스너를 사용하지 낳고 터치리스너를 사용한다.

 

OnTouchListener 사용 부분

  private OnTouchListener mTouchEvent = new OnTouchListener() {

public boolean onTouch(View v, MotionEvent event) {

ImageView image = (ImageView) v;

switch (v.getId()) {

case R.id.image_player:

if (event.getAction() == MotionEvent.ACTION_DOWN) {

image.setColorFilter(0xaa111111, Mode.SRC_OVER);

} else if (event.getAction() == MotionEvent.ACTION_UP) {

image.setColorFilter(0x00000000, Mode.SRC_OVER);

}

break;

}

}

}

이미지가 눌렸을 때 이미지에 색을 넣어서 마치 눌린것과 같은 효과를 준다.

 

* 이미지를 눌러서 이벤트를 주려면 xml에서 android:clickable="true"을 넣어 주어야 한다.

 

신고


Posted by injunech
2016.10.03 12:02


Menifest 상에 설정하는 User-permission


 

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

//위치정보 확인함
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/>

//위치정보 확인함

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

//wifi 연결을 확인함
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>

//wifi 체인지를 확인함

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

//네트웍이 연결된것을 확인할수 있게함

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

//부팅완료를 확인할수있게함

<uses-permission android:name="android.permission.INTERNET"/>

// 인터넷을 사용함

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

// 외장메모리 사용

<uses-permission android:name="android.permission.RECODER_AUDIO"/>

//녹음이 가능하게 함

 

ACCESS_CHECKIN_PROPERTIES      체크인데이터베이스의_속성테이블로_액세스
ACCESS_COARSE_LOCATION         코스_로케이션_액세스_(Cell-ID/WiFi)
ACCESS_FINE_LOCATION           파인로케이션_액세스(GPS)          
ACCESS_LOCATION_EXTRA_COMMANDS 로케이션_옵션_커맨드_액세스       
ACCESS_MOCK_LOCATION           목_로케이션_프로바이더_생성_(테스트용)
ACCESS_NETWORK_STATE           네트워크_상태_접근                
ACCESS_SURFACE_FLINGER         서피스_플링거_접근                
ACCESS_WIFI_STATE              WiFi상태_접근                     
ADD_SYSTEM_SERVICE             시스템서비스_추가                 
BATTERY_STATS                  배터리_상태                       
BLUETOOTH                      블루투스                          
BLUETOOTH_ADMIN                블루투스_어드민                   
BRICK                          디바이스_실효성_지정              
BROADCAST_PACKAGE_REMOVED      제거된_패키지에_대한_notification_브로드캐스트
BROADCAST_SMS                  SMS에_대한_브로드캐스트           
BROADCAST_STICKY               인텐트_브로드캐스트               
CALL_PHONE                     통화                              
CALL_PRIVILEGED                통화(긴급전화_포함)               
CAMERA                         카메라                            
CHANGE_COMPONENT_ENABLED_STATE 컴포넌트의_실효성_변경            
CHANGE_CONFIGURATION           컨피그_변경                       
CHANGE_NETWORK_STATE           통신상태_변경                     
CHANGE_WIFI_STATE              WiFi상태_변경                     
CLEAR_APP_CACHE                어플리케이션_캐시_클리어          
CLEAR_APP_USER_DATA            어플리케이션의_유저데이터_클리어  
CONTROL_LOCATION_UPDATES       위치정보_갱신                     
DELETE_CACHE_FILES             캐시파일_제거                     
DELETE_PACKAGES                패키지_제거                       
DEVICE_POWER                   전원상태에_대한_로우레벨_접근     
DIAGNOSTIC                     진단리소스_읽고쓰기               
DISABLE_KEYGUARD               키_가드_끄기_DUMP_덤?            
EXPAND_STATUS_BAR              상태표시줄_확장                   
FACTORY_TEST                   팩토리_테스트                     
FLASHLIGHT                     플래시라이트                      
FORCE_BACK                     포스백                            
GET_ACCOUNTS                   어카운트_획득                     
GET_PACKAGE_SIZE               패키지_획득                       
GET_TASKS                      태스크_획득                       
HARDWARE_TEST                  하드웨어테스트                    
INJECT_EVENTS                  유저이벤트_키/트랙볼              
INSTALL_PACKAGES               패키지_인스톨                     
INTERNAL_SYSTEM_WINDOW         내부_시스템윈도_활용              
INTERNET                       인터넷                            
MANAGE_APP_TOKENS              어플리케이션_토큰관리             
MASTER_CLEAR                   마스터_클리어                     
MODIFY_AUDIO_SETTINGS          오디오설정_편집                   
MODIFY_PHONE_STATE             전화상태_편집                     
MOUNT_UNMOUNT_FILESYSTEMS      파일시스템_편집                   
PERSISTENT_ACTIVITY            액티비티_지속                     
PROCESS_OUTGOING_CALLS         전화_발신처리_접근                
READ_CALENDAR                  캘린더_읽어오기                   
READ_CONTACTS                  주소록_읽어오기                   
READ_FRAME_BUFFER              프레임버퍼_읽어오기               
READ_INPUT_STATE               입력상태_읽어오기                 
READ_LOGS                      로그_읽어오기                     
READ_OWNER_DATA                owner_data읽어오기                
READ_PHONE_STATE               통화상태_읽어오기_READ_SMS_SMS읽어오기
READ_SYNC_SETTINGS             동기설정_읽어오기                 
READ_SYNC_STATS                동기상태_읽어오기                 
REBOOT                         reboot                            
RECEIVE_BOOT_COMPLETED         boot완료                          
RECEIVE_MMS                    MMS수신                           
RECEIVE_SMS                    SMS수신                           
RECEIVE_WAP_PUSH               WAP수신                           
RECORD_AUDIO                   오디오_수신                       
REORDER_TASKS                  태스크_Z오더                      
RESTART_PACKAGES               패키지_리스타트                   
SEND_SMS                       SMS송신                           
SET_ACTIVITY_WATCHER           액티비티_왓쳐지정                 
SET_ALWAYS_FINISH              액티비티_전체_종료                
SET_ANIMATION_SCALE            스케일_애니메이션_지정            
SET_DEBUG_APP                  디버그어플리케이션_지정           
SET_ORIENTATION                스크린_로테이션지정               
SET_PREFERRED_APPLICATIONS     자주_사용하는_어플리케이션_지정   
SET_PROCESS_FOREGROUND         포어그라운드_처리지정             
SET_PROCESS_LIMIT              제한처리_지정                     
SET_TIME_ZONE                  타임존_지정                       
SET_WALLPAPER                  배경화면_지정                     
SET_WALLPAPER_HINTS            배경화면_힌트_지정                
SIGNAL_PERSISTENT_PROCESSES    지속처리_시그널_지정              
STATUS_BAR                     상태표시줄_지정                   
SUBSCRIBED_FEEDS_READ          서브스트립드_피즈_읽어오기        
SUBSCRIBED_FEEDS_WRITE         서브스트립드_피즈_쓰기            
SYSTEM_ALERT_WINDOW            알림_윈도우                       
VIBRATE                        진동                              
WAKE_LOCK                      알람                              
WRITE_APN_SETTINGS             APN설정_쓰기                      
WRITE_CALENDAR                 캘린더_쓰기                       
WRITE_CONTACTS                 주소록_쓰기                       
WRITE_GSERVICES                G서비스_쓰기                      
WRITE_OWNER_DATA               owner_data쓰기                    
WRITE_SETTINGS                 설정_쓰기
WRITE_SMS                      SMS쓰기 
WRITE_SYNC_SETTINGS            동기설정_쓰기

신고


Posted by injunech
2016.10.01 21:13


[Android] 알람 링톤 (Alarm Ringtone) 선택하기



알람의 벨소리(링톤) 을 선택하고 싶을 때 참고하세요.


DialogPicker를 startActivityForResult()로 호출 하고

해당 Dialog 에서 선택된 Ringtone 의 Uri 를 onActivityResult() 콜백 함수에서 받아온다.


onActivityResult() 콜백 함수 내에서 999 호출 되었을때 

선택된 Ringtone 의 URI 를 저장하거나 해당 링톤을 재생하거나 원하는 대로 코딩하면 됩니다.


private void showRingtonePickerDialog() {
    Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);
    intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TITLE, "Select ringtone for notifications:");
    intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_SILENT, false);
    intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, true);
    intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE,RingtoneManager.TYPE_NOTIFICATION);
    startActivityForResult(intent, 777);
}



@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK) {
        switch (requestCode) {
           case 999:
                    Uri uri = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
                    if (uri != null) {
                        String ringtonePath = uri.toString();
                        Toast.makeText(getApplicationContext(), "ringtone="+ringtonePath, Toast.LENGTH_LONG).show();
                    }
           break;
 
        default:
           break;
        }
    }
}



# intent 에서 아래의 옵션을 설정 하여 보여주고싶은 Alarm Ringtone 의 목록 설정


Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TITLE, "Select ringtone");
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_SILENT, false);
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, true);

// 아래 4가지중 선택
// intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_ALL);
// intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_ALARM);
// intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_NOTIFICATION);
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE,  RingtoneManager.TYPE_RINGTONE);





신고


Posted by injunech
2016.09.23 01:26


ListView를 보시면 화면을 터치한 후 드래그하는 속도에 따라 ListView의 스크롤링 속도가 변하는 것을 볼 수 있습니다. 천천히 하면 스크롤도 천천히 되고 빠르게 드래그하면 바퀴 돌 듯이 ListView가 스크롤 되지요. 이런 효과는 어떻게 구현될 수 있을까요? 안드로이드에서 제공하는 클래스를 통해 쉽게 구현할 수 있습니다. 다음의 코드를 보시죠.


public class MyOnTouchListener implements OnTouchListener {

    private VelocityTracker mVelocityTracker;

    public boolean onTouch(View v, MotionEvent event) {

        if (mVelocityTracker == null) {

            mVelocityTracker = VelocityTracker.obtain();

        }

        mVelocityTracker.addMovement(event);


        switch (event.getAction()) { 

        case MotionEvent.ACTION_DOWN:

            Log.v(TAG"ACTION_DOWN");

            break



        case MotionEvent.ACTION_MOVE:

            Log.v(TAG"ACTION_MOVE");

            mVelocityTracker.computeCurrentVelocity(1);

            float velocity = mVelocityTracker.getXVelocity();

            break


        case MotionEvent.ACTION_UP:

            Log.v(TAG"ACTION_UP");

            if (mVelocityTracker != null) {

                mVelocityTracker.recycle();

                mVelocityTracker = null;

            }

            break

        } 

        return true;

    }

}


요점은 VelocityTracker가 드래그의 속도를 측정해준다는 것입니다. 위의 예제에서는 VelocityTracker의 5가지 메소드가 사용되었습니다.

1. obtain()
   이것은 정적 메소드입니다. VelocityTracker의 인스턴스를 구하기 위한 팩토리 메소드입니다.
2. addMovement(MotionEvent e)
   속도를 측정하기 위해서 VelocityTracker 인스턴스에 MotionEvent를 입력합니다.
3. computeCurrentVelocity(int unit)
   입력된 데이타를 기반으로 속도를 측정합니다. unit은 측정 시간 단위이며 1은 1밀리초를, 1000은 1초를 의미합니다. 다시 말해 unit이 1이라면 1밀리초동안의 픽셀단위의 이동 거리를 측정합니다.
4. getXVelocity()
   X축으로의 속도를 구합니다. Y축으로의 속도는 getYVelocity()를 사용하면 됩니다. 
5. recycle()
   객체를 재사용할 수 있도록 초기화 합니다.
   드래깅 속도 측정은 빈번하게 일어나는 연산입니다. 하지만 이를 위해서 각각의 OnTouchListener가 VelocityTracker의 인스턴스를 하나씩 점유하는 것은 분명 낭비입니다.(안드로이드는 임베디드 시스템을 위한 운영체제임!) 따라서 VelocityTracker 객체의 생성은 팩토리 메소드에 위임하고 객체는 사용 후 반환합니다. 그러면 결과적으로 VelocityTracker 객체 하나가 모든 드래깅 동작에 공유되어 사용될 수 있습니다. 




출처 : http://anddev.tistory.com/16


신고


Posted by injunech
2016.09.14 01:20



# String to Int



 int numInt = Integer.parseInt(numStr);


 


# Int to String



 String numStr2 = String.valueOf(numInt);
 

신고


Posted by injunech

티스토리 툴바