2012년 4월 23일 월요일

[android] sd / assets 경로


1. assets : file:///android_asset/test.png

2. sdcard : file:///sdcard/test/test_img.png


+ 코드상에서 sd path :

Environment.getExternalStorageDirectory().getAbsolutePath();



+ Assets에 있는 이미지 비트맵으로 가져오는 함수

/**
* Assets에 있는 이미지 가져오기
         * 작성자 : Choi Areum
*/
public static Bitmap loadBitmap(Resources resources, String urlStr) {
Bitmap bitmap = null;
AssetManager mngr = resources.getAssets();
try {
InputStream is = mngr.open(urlStr);
bitmap = BitmapFactory.decodeStream(is);
} catch(Exception e) {
}
return bitmap;
}

[android] 매니페스트 파일 구조

<?xml version="1.0" encoding="utf-8"?>

<manifest>       // 응용 프로그램의 패키지 이름 및 버전 정보를 설정

    <uses-permission />      // 응용 프로그램에 필요한 권한 등록
    <permission />              // 응용 프로그램이 다른 응용 프로그램에게 허락하는 권한들을 등록
    <permission-tree />       // 권한 트리 등록
    <permission-group />    // 권한 그룹 등록
    <instrumentation />       // 응용 프로그램과 시스템 리소스와의 상호작용을 모니터링하는 데 유효
    <uses-sdk />              // 응용프로그램 어느 버전의 안드로이드 환경에서 사용할 수 있는지 설정
    <uses-configuration /> // 응용프로그램에 필요한 모든 하드웨어 및 소프트웨어 입력 구성을 정의
    <uses-feature />         // 응용프로그램에서 사용되는 특정 Feature를 설정
    <supports-screens />  // 응용프로그램에서 지원하는 화면 크기를 설정

    <application>              // 응용프로그램의 이름과 아이콘을 설정 

        <activity>               // 응용프로그램의 모든 액티비티를 각각 하나의 <activity>요소로 등록 
            <intent-filter>
                <action />
                <category />
                <data />
            </intent-filter>
            <meta-data />
        </activity>

        <activity-alias>      // 액티비티 별칭
            <intent-filter> . . . </intent-filter>
            <meta-data />
        </activity-alias>

        <service>            // 서비스 등록 
            <intent-filter> . . . </intent-filter>
            <meta-data/>
        </service>

        <receiver>          // 방송 수신자 등록 
            <intent-filter> . . . </intent-filter>
            <meta-data />
        </receiver>

        <provider>         // 콘텐트 제공자 등록 
            <grant-uri-permission />
            <meta-data />
        </provider>

        <uses-library />  // 표준패키지 외에 지도 서비스처럼 추가로 연동되는 다른 패키지들을 링크

    </application>

</manifest>

[android] startActivityForResult 사용시 주의점

A -> B 액티비티 사이에서 데이터를 주고 받는 방법은 많이 있지만 
startActivityForResult 를 이용하여 호출한 액티비티의 리턴값을 받아 처리를 하고 싶을 경우

A 액티비티에서 startActivityForResult 로 B액티비티를 호출해 다시 A로 돌아와서

onActivityResult를 오버라이드해서 보통 쓰는데

A액티비티를 destory (종료) 시키거나 A 액티비티를 부르는데 있어서
intent flag에 Intent.FLAG_ACTIVITY_NO_HISTORY 속성을 주게 되면 
onActivityResult로 돌아오지도 안고 destory 되 버린다 ㅠ.ㅠ

구조상 여러 액티비티를 호출하고 있어서 태스크에 쌓아두지 않으려고 추가한 속성인데
잘되던 처리가 되지않아서 한참 삽질을.. 흑;

[android] WebView에서 Flipper처리


회사에서 작업하다 웹뷰로 작성한 화면을 플립처리를 해줘하는 상황이 됐다.
웹뷰의 스크롤 처리와 (상하) 해당화면의 플립처리(좌우) 하는데 좀 애를 먹었어서 해당 처리를 정리해놓자!!

우선 XML에 뷰플립퍼를 정의 하고
 <?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:orientation="vertical"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
   android:id="@+id/layout_article">
    <ViewFlipper android:id="@+id/artflipper"
       android:layout_width="fill_parent"
       android:layout_height="fill_parent">
    </ViewFlipper>
 </LinearLayout>       

소스코드에서 웹뷰를 등록한다.

        final String mimeType = "text/html";
        final String encoding = "utf-8";

        WebView wv;

        wv = new WebView(getApplicationContext());
        //        wv.loadData("<a href='x'>Hello World! - 5</a>", mimeType, encoding);
        wv.loadDataWithBaseURL("about:blank"
            ,"<img src=\"file:///android_asset/buttom_bg.png\" width='100%' />"
            , mimeType,   encoding, "");

          여기서 loadDataWithBaseURL(디폴트웹화면, 웹화면,  인코딩할 녀석, 인코딩종류
        , 히스토리화면) 메소드와 loadData() 메소드의 차이점은 loadData()는 인코딩할때
        태그와 텍스트를 구분하지않고 인코딩하므로 html태그가 깨질수 있다. 
        허나 loadDataWithBaseURL()메소드는 태그와 값을 구분해서
        인코딩해주는 아주 착한 녀석 ㅋㅋ
        나는 테스트로 이미지를 띄웠는데 해당 이미지는 안드로이드 프로젝트의 assets아래
        있는 녀석이다.
        width를 정해준거는 실제 이미지가 디바이스 화면보다 큰 이미지였는데 그냥 이미지 
        지정만 하면 화면 밖으로 나가버린다 ㅠㅠ 그래서 이래저래 찾아보다 저렇게 
        너비를 100%로 지정해주면 해당 부모의 너비 만큼 축소해서 보여준다! 착한녀석!!       

        viewFlipper.addView(wv);       //이렇게 플립퍼에 뷰를 추가하고
        wv.setOnTouchListener(this);  //웹뷰의 터치리스너를 등록해준다. 
                                                   //아무리 플리퍼에 리스너를 등록해서 웹뷰 위에서 터치 이벤트를 
                                                   //감지하지 못한다 ㅠㅠ 완전 삽질함. 

        wv = new WebView(getApplicationContext());
        //        wv.loadData("<a href='x'>Hello World! - 6</a>", mimeType, encoding);
        wv.loadDataWithBaseURL("about:blank",
           "<table border='0' cellSpacing='1' cellPadding='0' width='300' bgColor='#b7bcc5' height='40'>" +
           "<tbody><tr bgColor='#ffffff'><td width='329'>
            <img src=\"file:///android_asset/buttom_bg.png\" width='100%' /></td>
            <td width='329'>&nbsp;</td></tr>" +
           "<tr bgColor='#ffffff'><td>한글</td><td>&nbsp;</td&gt;</tr></tbody></table>"
          , mimeType,   encoding, "");
        viewFlipper.addView(wv);
        wv.setOnTouchListener(this);
        // 이번에 테이블 태크를 넣어봤다. 테이블 레이아웃으로 테이블 스러운 디자인이 아무리 해도 
        // 나오질 않아서 웹뷰를 이용 HTML로 테이블을 표현하기로 결정! 
        // 해당 테이블이 글씨 뿐만 아니라 이미지도 표현해야 하므로 테이블 안에 
        // 이미지도 넣어보고 한글도 넣어보고 ㅋ  
        wv = new WebView(getApplicationContext());
        wv.loadDataWithBaseURL("about:blank",
            "<table border='0' cellSpacing='1' cellPadding='0' width='300' bgColor='#b7bcc5' height='40'>" +
            "<tbody><tr bgColor='#ffffff'><td width='329'>
             <img src=\"file:///sdcard/test/test_img.png\" width='100%' /></td>
             <td width='329'>&nbsp;</td></tr>" +
           "<tr bgColor='#ffffff'><td>한글</td><td>&nbsp;</td&gt;</tr></tbody></table>"
           , mimeType,   encoding, "");
        viewFlipper.addView(wv);
        wv.setOnTouchListener(this);

    public boolean onTouch(View arg0, MotionEvent event) {

        switch (event.getAction()){
            case MotionEvent.ACTION_DOWN:{
                // store the X value when the user's finger was pressed down
                Log.i("ACTION_DOWN", "OK!!!!!!");

                downXValue = event.getX();
                downYValue = event.getY();

                break;
            }
            case MotionEvent.ACTION_UP:    {
                // Get the X value when the user released his/her finger
                Log.i("ACTION_UP", "OK!!!!!!");

//              upXValue = event.getX();
//              upYValue = event.getY();
           
                if (downXValue > upXValue + 100)
                    viewFlipper.showNext();
                    Log.i("자식뷰 인덱스", viewFlipper.getChildCount()+"");
                    Log.i(" 터치 확인 ", "left");
                if (downXValue+100 < upXValue)
                    viewFlipper.showPrevious();
                    Log.i(" 터치 확인 ", "right");
//                if (downYValue > upYValue +100)
//                    Log.i(" 터치 확인 ", "up");
//                if (downYValue+100 < upYValue)
//                    Log.i(" 터치 확인 ", "down");

                break;
            }
        }

        return true;

    }

이렇게 터치 리스너를 오버라이드 해주면 OK 좌우 뿐만 아니라 상하로도 구현할수 있따!

좌우로 터치했을때 플립효과를 주기위해 해당 조건에 맞으면 플리퍼의 이동 메소드를 호출하면 OK!!

+100 씩 해주는거 터치해서 잡는 좌표값이 float타입으로 아주 미세한 수치로도 변화가 읽어나므로 확실한 좌우/ 상하 플립으로 인식하기 위한 일종의 값을 넣어준거임