펌 OK (출처 표시), 상업적 이용 NO, 컨텐츠 변경 NO



ListView Adapter 내부 getView 메소드에서 아래와 같은 방식 적용


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

.

.

.

HorizontalScrollView mScrollView = (HorizontalScrollView) convertView.findViewById(R.id.rf_horizon_scroll);

mScrollView.setOnTouchListener(new ScrollViewOnTouchListener(mScrollView, position));

.

.


}


private class ScrollViewOnTouchListener   implements View.OnTouchListener {

        HorizontalScrollView view;

        float historicX = Float.NaN;

        static final int DELTA_ON_CLICK = 30; // 이동 허용 범위

        long historicTime;

        int position;

        public ScrollViewOnTouchListener(HorizontalScrollView view, int position){

            this.view = view;

            this.position = position;

        }


        @Override

        public boolean onTouch(View v, MotionEvent event)

        {

            switch (event.getAction())

            {

                case MotionEvent.ACTION_DOWN:

    v.setBackgroundColor(Color.parseColor("#D5D5D5"));    // 터치된 리스트 아이템 색상 변경을 위한 코드

                    historicX = event.getX();

                    historicTime = System.currentTimeMillis();

                    break;


                case MotionEvent.ACTION_UP:

                    if (Math.abs(event.getX() - historicX) < DELTA_ON_CLICK) {

  // 아이템 터치시 작업할 내용

                    }

                    break;

                case MotionEvent.ACTION_CANCEL:

                    v.setBackgroundColor(Color.parseColor("#00000000"));   // UP or CANCEL 이벤트 발생 시 아이템 배경색 원상복구

                    break;

                default: return false;

            }

            return true;

        }

    }


설명 : 리스트뷰 내부에 스크롤뷰 영역은 리스트뷰의 아이템 터치이벤트가 발생하지 않는다.

          때문에 스크롤뷰에 클릭 리스너를 등록하여 최초 터지 지점(DOWN) 부터 UP 까지의 픽셀이 짧은 경우 스크롤링이 아닌

          단순 터치로 판단하고 그에 따른 이벤트를 실행하는 방법이다.

          경우에 따라 시간 필터를 추가로 적용 가능하다.



댓글을 달아 주세요

Android/View | Posted by 덩치 2016. 3. 7. 16:56

Dialog 뒤의 뷰 터치 가능하게 하기

펌 OK (출처 표시), 상업적 이용 NO, 컨텐츠 변경 NO



mDialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);


추가


응용 : 구글맵에서 CustomDialog가 떠 있는 상태에서 다른 마커를 터치시 바로 마커 터치이벤트가 발생

          해당 옵션이 없는 상태에서 마커를 터치하면 Dialog Outside터치이벤트가 발생하고 마커 터치이벤트 발생 X



댓글을 달아 주세요

Android/WI-FI | Posted by 덩치 2015. 8. 31. 14:55

소스코드로 WiFi 연결시키기

펌 OK (출처 표시), 상업적 이용 NO, 컨텐츠 변경 NO




WPA2 이외 보안방식에서도 작동하는지 테스트 안됨.

테스트 해보신분 댓글로 알려주시면 감사하겠습니다.


WifiConfiguration wifiConfig = new WifiConfiguration();

wifiConfig.SSID = String.format("\"%s\"", "ssid");

wifiConfig.preSharedKey = String.format("\"%s\"", "password");


WifiManager wifiManager = (WifiManager)getSystemService(WIFI_SERVICE);

int netId = wifiManager.addNetwork(wifiConfig);

wifiManager.disconnect();

wifiManager.enableNetwork(netId, true);

wifiManager.reconnect();




출처 : http://stackoverflow.com/questions/8818290/how-to-connect-to-a-specific-wifi-network-in-android-programmatically



댓글을 달아 주세요

  1.  댓글주소  수정/삭제  댓글쓰기 2016.09.02 16:21

    비밀댓글입니다

펌 OK (출처 표시), 상업적 이용 NO, 컨텐츠 변경 NO



매니페스트에 설정된 어플의 버전을 가져오는 방법이다.


직접적으로 매니페스트의 버전을 가져올 수 없기때문에


패키지매니저를 통해 자기자신 패키지명을 대입하여


설치정보를 가져오는 방식이다.


public static String getPackageVersion(Context context) {

try {

PackageInfo pi = context.getPackageManager()

.getPackageInfo(context.getPackageName(),

PackageManager.GET_UNINSTALLED_PACKAGES);

return pi.versionName;

}

catch(Exception e) {

}

return new String("");

}


예를들어 매니페스트의 버전이 android:versionName="1.0.0" 이라면


1.0.0을 리턴한다.


버전체크가 필요할때 주로 사용되는 방법이다.



댓글을 달아 주세요

펌 OK (출처 표시), 상업적 이용 NO, 컨텐츠 변경 NO



웹뷰 내용을 롱클릭 하면 블럭설정이 된다.


기본적으로 롱클릭리스너에서 false를 리턴하기때문인데


아래와 같이 true로 수정하면 블럭지정이 되지 않는다.



mWebView.setOnLongClickListener(new OnLongClickListener() {

@Override

public boolean onLongClick(View v) {

return true;

}

});




댓글을 달아 주세요

펌 OK (출처 표시), 상업적 이용 NO, 컨텐츠 변경 NO


Error:Apostrophe not preceded by  에러는


string.xml 파일에서 어퍼스트로피(') 문자를 잘못 사용하는 경우 발생한다.

그중에서도 문자열 내용에 특수문자가 포함되어있을경우 나타나는데

간단하게 문자열 양 끝에 " 를 붙여주면 해결된다. 

예를 들면

<string name="dialog_message">'테스트용' 문자열입니다.</string>


이를


<string name="dialog_message">"'테스트용' 문자열입니다."</string>


이렇게 바꿔주면 된다.


물론 메시지를 출력해도 " 문자는 출력되지 않는다.


다른 해결방법으로는


어퍼스트로피 앞에 \를 붙여주는것이다. 예를들면


<string name="dialog_message">\'테스트용\' 문자열입니다.</string>




댓글을 달아 주세요

  1.  댓글주소  수정/삭제  댓글쓰기 zelaw 2015.11.18 12:47

    좋은 자료 감사합니다. 덕분에 해결 했습니다.

펌 OK (출처 표시), 상업적 이용 NO, 컨텐츠 변경 NO


이미지 크기를 절대값으로 주고 여러 단말에서 확인을 해 보면, 단말 해상도에 따라 이미지 크기가


제각각인 경우가 있다.


애초에 이미지를 선언할 때 xml에서 dp로 줘버리면 상관이 없겠지만(drawable 폴더에 제대로 분기했다는 가정 하에),


소스코드상에서 비트맵을 만들고, 그 이미지를 뿌리는 경우 참 애매하다.


이때 해상도별로 사이즈 설정을 통일되게 하는 방법에 대해 알아보자.


예를들어Height1280px인 단말기에서 알맞은 이미지 width28px, height28px 일 때,


이보다 높거나 낮은 해상도에서 그에 맞는 사이즈로 리사이징을 하기 위한 방법이다.


먼저 단말의 해상도를 구해야한다.


Drawable d = getResources().getDrawable(id);

DisplayMetrics displayMetrics = new DisplayMetrics();

getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);

float deviceHeight = displayMetrics.heightPixels;


이렇게하면 deviceHeight 에는 단말의 Height 사이즈가 리턴된다.

(어떤 단말에서는 1280, 어떤 단말에서는 2500몇 .. 이런식으로)


int dp = (int) (28 * (deviceHeight / 1280));


여기서 281280은 위에서 예시를 든것과 같이


1280px의 해상도 단말에서 알맞게 표시되는 이미지 크기 28px을 뜻한다.


이렇게 하면 단말 해상도가 커지거나 작아져도 dp값이 그에 따라 커지고 작아져서


모든 단말에서 알맞은 사이즈로 이미지가 표시된다.


디테일을 요구하는 작업에서는 다른 필터링이 추가되어야하겠지만, 일반적인범위 내에서는


위 방법을 이용하면 사이즈가 알맞게 잘 표시가 되었다.




댓글을 달아 주세요

펌 OK (출처 표시), 상업적 이용 NO, 컨텐츠 변경 NO


1.구버전 안드로이드 기본브라우저 (약 S5 이전단말의 기본브라우저)


try {

String[] proj = new String[] { Browser.BookmarkColumns.TITLE, Browser.BookmarkColumns.URL};

String sel = Browser.BookmarkColumns.BOOKMARK + " = 1"; // 0 = history, 1 = bookmark

Cursor mCur = getContentResolver().query(Browser.BOOKMARKS_URI, proj, sel, null, null);

mCur.moveToFirst();

String title = "";

String url = "";


if (mCur.moveToFirst() && mCur.getCount() > 0) {

boolean cont = true;

while (mCur.isAfterLast() == false && cont) {

title = mCur.getString(mCur.getColumnIndex(Browser.BookmarkColumns.TITLE));

url = mCur.getString(mCur.getColumnIndex(Browser.BookmarkColumns.URL));

mCur.moveToNext();

      }


}

}

catch (Exception e) {

}



2. 크롬 브라우저


try {

String[] proj = new String[] { Browser.BookmarkColumns.TITLE, Browser.BookmarkColumns.URL, Browser.BookmarkColumns.DATE };

Uri uriCustom = Uri.parse("content://com.android.browser/bookmarks");

String sel = Browser.BookmarkColumns.BOOKMARK + " = 1"; // 0 = history, 1 = bookmark

Cursor mCur = getContentResolver().query(uriCustom, proj, sel, null, null);

mCur.moveToFirst();

String title = "";

String url = "";


if (mCur.moveToFirst() && mCur.getCount() > 0) {

boolean cont = true;

while (mCur.isAfterLast() == false && cont) {

title = mCur.getString(mCur.getColumnIndex(Browser.BookmarkColumns.TITLE));

url = mCur.getString(mCur.getColumnIndex(Browser.BookmarkColumns.URL));


        }

mCur.moveToNext();

      }


}

}

catch (Exception e) {

}


3. 최신단말의 안드로이드 S브라우저 (약 S5이후 단말에서 많이 사용하는것같음)


try {

String[] proj = new String[] { Browser.BookmarkColumns.TITLE, Browser.BookmarkColumns.URL, Browser.BookmarkColumns.DATE };

Uri uriCustom = Uri.parse("content://com.sec.android.app.sbrowser.browser/bookmarks");

String sel = Browser.BookmarkColumns.BOOKMARK + " = 1"; // 0 = history, 1 = bookmark

Cursor mCur = getContentResolver().query(uriCustom, proj, sel, null, null);

mCur.moveToFirst();

String title = "";

String url = "";


if (mCur.moveToFirst() && mCur.getCount() > 0) {

boolean cont = true;

while (mCur.isAfterLast() == false && cont) {

if (!TextUtils.isEmpty(url)) {

title = mCur.getString(mCur.getColumnIndex(Browser.BookmarkColumns.TITLE));

url = mCur.getString(mCur.getColumnIndex(Browser.BookmarkColumns.URL));


}

mCur.moveToNext();

      }


}

}

catch (Exception e) {

}



댓글을 달아 주세요

  1.  댓글주소  수정/삭제  댓글쓰기 질문있어요 2015.11.07 14:35

    SDK몇버전에서 사용하신건가요? browser클레스에 관련 함수들이 없네요
    안드로이드디벨로퍼 들어가봐도 삭제된 메소드라고만 적혀있고..
    다른데에서 해당기능을 하는게 있을꺼같은데.. 보안상없앤거같기도하고 찾기힘드네요 ㅠ,.ㅠ

  2.  댓글주소  수정/삭제  댓글쓰기 저도 질문있어요 2016.04.03 16:52

    빌드타겟 23에서는 방법이 없을까요 ?

Android/기본스킬 | Posted by 덩치 2014. 11. 17. 17:19

전원버튼 이벤트 감지하기

펌 OK (출처 표시), 상업적 이용 NO, 컨텐츠 변경 NO


IntentFilter powerFilter = new IntentFilter(Intent.ACTION_SCREEN_OFF);

registerReceiver(mPowerBroadcast, powerFilter);



BroadcastReceiver mPowerBroadcast = new BroadcastReceiver() {

@Override

public void onReceive(Context context, Intent intent) {

if(Intent.getAction().equals("android.intent.action.SCREEN_OFF") {

// 스크린이 꺼질때 이벤트

}

else if(Intent.getAction().equals("android.intent.action.SCREEN_ON") {

// 스크린이 켜질때 이벤트

}

else

return;

}


}


그리고 onDestroy 등에서

unregisterReceiver(mPowerBroadcast);

를 이용해 브로드캐스트를 종료한다.



댓글을 달아 주세요

Android/기본스킬 | Posted by 덩치 2014. 11. 17. 17:12

홈버튼 이벤트 감지하기

펌 OK (출처 표시), 상업적 이용 NO, 컨텐츠 변경 NO

@Override

protected void onUserLeaveHint() {

//여기서 감지

Log.d(TAG, "Home Button Touch");

super.onUserLeaveHint();

}


홈키 눌렀을때 작동되어야 하는 작업들을 위의 소스코드를 이용하여 처리할 수 있다.




댓글을 달아 주세요

  1.  댓글주소  수정/삭제  댓글쓰기 아데우스 2015.06.09 09:54

    100퍼센트 불가능입니다. 저 이벤트가 홈키때만 호출되는것이 아니라 여러 상황에 호출되기 때문에 예외처리를 추가해줘야해요 생명주기 순서를 따져서 홈키인지 아닌지를 판별해야합니다.

    •  댓글주소  수정/삭제 덩치 2015.06.10 18:10 신고

      좋은지적 감사합니다. 이 글을 참고하시는분들은 홈키를 판단하실때 생명주기가 홈키를 눌렀을때와 동일한 주기로 입력됐는지 확인하는 부분을 추가하시면 되겠습니다. 빠른 시일 내 업데이트 하겠습니다.