보물창고/Programming2011.09.22 22:46







안드로이드 에러, 디바이스에서는 되는데 에뮬에서 안될때 [android, error, device]

안드로이드 에러 중 디바이스에서는 잘 되다가 에뮬에서 안될때 한번쯤 확인 해볼 사항 입니다









 

09-22 07:56:28.315: ERROR/AndroidRuntime(813): FATAL EXCEPTION: main

09-22 07:56:28.315: ERROR/AndroidRuntime(813): java.lang.RuntimeException: Unable to start activity ComponentInfo{ibm.cw.f5/ibm.cw.f5.TestJSActivity}: android.view.InflateException: Binary XML file line #2: Error inflating class android.widget.LinearLayout

09-22 07:56:28.315: ERROR/AndroidRuntime(813):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1622)

09-22 07:56:28.315: ERROR/AndroidRuntime(813):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1638)

09-22 07:56:28.315: ERROR/AndroidRuntime(813):     at android.app.ActivityThread.access$1500(ActivityThread.java:117)

09-22 07:56:28.315: ERROR/AndroidRuntime(813):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:928)

09-22 07:56:28.315: ERROR/AndroidRuntime(813):     at android.os.Handler.dispatchMessage(Handler.java:99)

09-22 07:56:28.315: ERROR/AndroidRuntime(813):     at android.os.Looper.loop(Looper.java:123)

09-22 07:56:28.315: ERROR/AndroidRuntime(813):     at android.app.ActivityThread.main(ActivityThread.java:3647)

09-22 07:56:28.315: ERROR/AndroidRuntime(813):     at java.lang.reflect.Method.invokeNative(Native Method)

09-22 07:56:28.315: ERROR/AndroidRuntime(813):     at java.lang.reflect.Method.invoke(Method.java:507)

09-22 07:56:28.315: ERROR/AndroidRuntime(813):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)

09-22 07:56:28.315: ERROR/AndroidRuntime(813):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)

09-22 07:56:28.315: ERROR/AndroidRuntime(813):     at dalvik.system.NativeStart.main(Native Method)

09-22 07:56:28.315: ERROR/AndroidRuntime(813): Caused by: android.view.InflateException: Binary XML file line #2: Error inflating class android.widget.LinearLayout

09-22 07:56:28.315: ERROR/AndroidRuntime(813):     at android.view.LayoutInflater.createView(LayoutInflater.java:518)

09-22 07:56:28.315: ERROR/AndroidRuntime(813):     at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)

09-22 07:56:28.315: ERROR/AndroidRuntime(813):     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:568)

09-22 07:56:28.315: ERROR/AndroidRuntime(813):     at android.view.LayoutInflater.inflate(LayoutInflater.java:386)

09-22 07:56:28.315: ERROR/AndroidRuntime(813):     at android.view.LayoutInflater.inflate(LayoutInflater.java:320)

09-22 07:56:28.315: ERROR/AndroidRuntime(813):     at android.view.LayoutInflater.inflate(LayoutInflater.java:276)

09-22 07:56:28.315: ERROR/AndroidRuntime(813):     at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:207)

09-22 07:56:28.315: ERROR/AndroidRuntime(813):     at android.app.Activity.setContentView(Activity.java:1657)

09-22 07:56:28.315: ERROR/AndroidRuntime(813):     at ibm.cw.f5.TestJSActivity.onCreate(TestJSActivity.java:34)

09-22 07:56:28.315: ERROR/AndroidRuntime(813):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)

09-22 07:56:28.315: ERROR/AndroidRuntime(813):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1586)

09-22 07:56:28.315: ERROR/AndroidRuntime(813):     ... 11 more

09-22 07:56:28.315: ERROR/AndroidRuntime(813): Caused by: java.lang.reflect.InvocationTargetException

09-22 07:56:28.315: ERROR/AndroidRuntime(813):     at java.lang.reflect.Constructor.constructNative(Native Method)

09-22 07:56:28.315: ERROR/AndroidRuntime(813):     at java.lang.reflect.Constructor.newInstance(Constructor.java:415)

09-22 07:56:28.315: ERROR/AndroidRuntime(813):     at android.view.LayoutInflater.createView(LayoutInflater.java:505)

09-22 07:56:28.315: ERROR/AndroidRuntime(813):     ... 21 more

09-22 07:56:28.315: ERROR/AndroidRuntime(813): Caused by: java.lang.OutOfMemoryError: bitmap size exceeds VM budget

09-22 07:56:28.315: ERROR/AndroidRuntime(813):     at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)

09-22 07:56:28.315: ERROR/AndroidRuntime(813):     at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:450)

09-22 07:56:28.315: ERROR/AndroidRuntime(813):     at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:326)

09-22 07:56:28.315: ERROR/AndroidRuntime(813):     at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:697)

09-22 07:56:28.315: ERROR/AndroidRuntime(813):     at android.content.res.Resources.loadDrawable(Resources.java:1709)

09-22 07:56:28.315: ERROR/AndroidRuntime(813):     at android.content.res.TypedArray.getDrawable(TypedArray.java:601)

09-22 07:56:28.315: ERROR/AndroidRuntime(813):     at android.view.View.<init>(View.java:1951)

09-22 07:56:28.315: ERROR/AndroidRuntime(813):     at android.view.View.<init>(View.java:1899)

09-22 07:56:28.315: ERROR/AndroidRuntime(813):     at android.view.ViewGroup.<init>(ViewGroup.java:286)

09-22 07:56:28.315: ERROR/AndroidRuntime(813):     at android.widget.LinearLayout.<init>(LinearLayout.java:120)

09-22 07:56:28.315: ERROR/AndroidRuntime(813):     ... 24 more

 


디바이스에서는 되는데 에뮬에서 안되면고 위와 같은 에러를 표시하고 있었습니다.
에러가 정확하게 해석되지 않아 차근차근 하나씩 확인하면서 보니 이미지 해상도에 문제가 있었습니다.










배경과 버튼으로 사용할 이미지 해상도가 화면에 보이는것보다 1.5배에서 3배 이상 크게 만들었던게 문제였습니다


 

원래 필요 했던 이미지 사이즈


 

제작된 이미지 사이즈(클릭하시면 원래 큰 사이즈를 볼 수 있습니다)




이미지가 워낙 크다보니 xml레이아웃에서도 제대로 보이지 않아 이상하다 생각 했었습니다. 사이즈를 정확하게 줄이고 나니 레이아웃에도 정확하게 표시되고 에뮬에서도 에러없이 샐행 하는 모습을 볼 수 있었습니다

혹시나 에뮬에서 확인 안되는 에러나 나타난다면 확인해 보세요!



신고





Posted by 파란물
보물창고/Programming2011.08.24 23:01








안드로이드 get방식 데이터 u
rl 전달 한글 깨짐 인코딩 설정 방법 (안드로이드 URL 호출, 쓰기, jsp, android, euc-kr, utf-8, 디코딩, encode, decode, servlet, 서블릿)

안드로이드에서 GET방식 URL에 데이터를 쓸때
데이터를 전달받은 jsp 서블릿에서 받은 데이터중 한글이 깨지는 형상 해결 방법 입니다
ex) �������� ,  ???? ,  ã�±ã�·ã�´ã��ã�¹ 등등..








 

String contentText"일상";

String contentText2 = java.net.URLEncoder.encode(new String(contentText.getBytes("UTF-8")));

String getSql = "http://서블릿 주소?tn=neck_cold&con="+contentText2; 
                        

URL connect = new URL(getSql);

URLConnection urlConn = connect.openConnection();

HttpURLConnection httpCon = (HttpURLConnection)urlConn;

BufferedReader in = new BufferedReader(new InputStreamReader(httpCon.getInputStream()));

in.close();

 
전달 하는쪽 소스 입니다

밑줄 그은 부분이 해결 방법 입니다
contentText문자열에 인코딩을 해서 다시 스트링을 담게 됩니다 







 

response.setCharacterEncoding("EUC-kr");

String tableName = new String(request.getParameter("tn").getBytes("8859_1"),"UTF-8");

 
받는쪽 소스 코드 입니다 (서블릿)

첫번재줄 euc-kr은 웹브라우져에 출력할때 영향을 미칩니다
두번째줄 getByte이후는 db에 쓸때 영향을 미칩니다







이클립스 window -> Preferences => Workspace -> Text File encoding 을 손을 많이 댓었는데
default값 MS949로 해도 문제 없이 돌아갑니다 
 

 




참고한 블로그
http://ksprg.cafe24.com/?p=904
http://www.javadocexamples.com/java/net/URLEncoder/encode(String%20s,String%20enc).html




신고





Posted by 파란물







기사 제목
Android 로컬 데이터 저장소 API 이해하기

현재 안드로이드어플을 제작중인데 로컬에 데이터를 저장하는 방법이 필요해서 이 기사를 보게 되었습니다
포스팅 가장 아래 링크를 따라 가시면 예제 소스와 기사 전체 내용을 볼수 있습니다 



요약 
 모바일 디바이스에 로컬로 데이터를 저장하는 기능은 애플리케이션 실행이나 애플리케이션의 수명 동안 필수 정보를 유지하기 위해 필요한 모바일 애플리케이션을 위해 중요한 기능입니다. 개발자는 사용자 환경 설정 또는 애플리케이션 구성과 같은 정보를 지속적으로 저장해야 합니다. 액세스 가시성과 같은 특성에 따라 내부 또는 외부 스토리지를 탭핑해야 하는지 여부나 더 복잡하고 구조화된 유형의 데이터를 처리해야 하는지 여부도 결정해야 합니다. 이 기사를 읽고 Android 데이터 스토리지 API에 대해 살펴봅니다(특히 환경 설정, SQLite, 내부 및 외부 메모리 API).



목차
전제조건

샘플 애플리케이션

그림 1. 유스 케이스

표 1. 샘플 애플리케이션 클래스

목록 1. 친구 목록(Facebook Graph API JSON 형식)

목록 2. Friend 클래스

목록 3. 친구 데이터베이스 테이블

애플리케이션 환경 설정 저장하기

그림 2. 구현된 Preferences 화면

목록 4. 환경 설정 화면 XML 선언

목록 5. AppPreferenceActivity

목록 6. 의도를 사용하여 환경 설정 활동 호출하기

목록 7. AndroidManifest.xml에서 의도 정의하기

목록 8. SharedPreferences 사용하기

SQLite 데이터베이스 사용하기

목록 9. DBHelper

목록 10. DBHelper 초기화하기

목록 11. 데이터베이스 테이블 작성하기

목록 12. 행 삽입하기

목록 13. 데이터베이스 테이블 삭제하기

목록 14. ArrayList를 리턴하는 Select All 실행하기

목록 15. 커서를 리턴하는 Select All 실행하기

목록 16. 데이터베이스 버전이 변경되는지 감지하기

목록 17. 데이터베이스를 초기화하는 MainActivity onCreate()

목록 18. 데이터베이스에 삽입하는 MainActivity

목록 19. MainActivity Select All과 ListView에 데이터 바인드하기

개인용 데이터를 위해 디바이스의 내부 스토리지 사용하기

목록 20. 로컬 개인 저장소로부터 읽기

목록 21. 로컬 개인 저장소로부터 읽기

목록 22. 로컬 개인 저장소로부터 삭제하기

공용 데이터를 위해 디바이스의 외부 스토리지 사용하기

목록 23. 외부 스토리지를 사용할 수 있는지 테스트하기

목록 24. 외부 스토리지가 읽기 전용인지 테스트하기

목록 25. 외부 메모리에 쓰기

목록 26. 외부 메모리로부터 읽기

목록 27. 외부 메모리로부터 파일 삭제하기

목록 28. WRITE_EXTERNAL_STORAGE

관련 메소드

목록 29. 내부 메모리 캐시의 경로 검색하기

목록 30. 외부 메모리 캐시의 경로 검색하기



결론
 이 기사에서는 환경 설정에서 SQLite와 내부 및 외부 메모리 사용에 이르는 Android 스토리지 API에 대한 내용을 다루었다. 환경 설정 API를 사용하면 애플리케이션이 단순 환경 설정 정보를 수집하고 저장하도록 할 수 있다. SQLite API를 사용하여 더 복잡한 데이터를 저장할 수 있으며 내부 및 외부 스토리지를 사용하여 애플리케이션에 대해 개인용이거나 다른 애플리케이션에 공용으로 사용 가능한 파일을 저장할 수 있다. 세션에서 지속되는 저장된 데이터를 사용하면 네트워크와 연결이 끊긴 경우에도 애플리케이션이 작동할 수 있다. 이제 Android 애플리케이션 개발 시 이러한 유형의 스토리지를 모두 활용하는 데 필요한 전문지식을 가지고 있다.



기사 원문으로 가시면 에제 코드와 자세한 설명을 볼 수 있습니다
아이베엠 디벨로퍼 웍스 : http://www.ibm.com/developerworks/kr/
기사 원문 주소 : http://www.ibm.com/developerworks/kr/library/x-androidstorage/index.html

신고





Posted by 파란물
보물창고/Programming2011.08.15 18:55





안드로이드 ArrayAdapter사용 리스트뷰 구성시  Activity를 상속하면 onListItemClick 호출하기 어려움 (android, ListView 구현,  addFooterView, addHeaderView, 더보기 버튼 )








안드로이드 프로젝트를 하면서 UI 구현중에 어려웠던 부분을 정리해서 다른분들이 필요하실까 정리했습니다

포스팅 가장 아래에 제가 구현한 안드로이드 프로젝트 전체를 파일 첨부 했습니다
공부하면서 구현중에 있기 대문에 지저분한 주석이 모두 담겨 있습니다
필요하신 분들 소스 참고하세요! ^^










Activity를 상속하고 custom ArrayAdapter를 만들어서 리스트뷰(ListView)로 했을 경우 UI구현하는데 많은 제약이 있는거 같습니다

제약
 - addFooterView, addHeaderViewf를 달지 못합니다 (헤더,푸터 뷰)
 - 리스트뷰 안에 버튼이 들어간 경우 포커스가 버튼에 있어 리스트가 클릭되지 않습니다
    ( onListItemClick 함수가 호출 되지 않습니다 )

 Activity를 사용해서 가능하다는 글도 구글링에서 본거 같은데 관련 예제를 못찾아서 결국은 ListActivity를 사용했습니다
 속직히 리스트 액티비티를 사용하면 안될 이유가 없었지만 제가 인터넷에서 찾은 예제가 Activity를 사용하고 있어서 ListActivity로 바꾸는게 쉽지 않았습니다 하지만 리스트를 클릭하기 위해서 자료찾아보면서 바꿨습니다









Activity를 상속했을때와 ListActivity를 사용했을대 xml부분이 달라집니다 (빨간 글씨 참고)


Activity 상속시

<ListView

       android:id="@+id/list"

       android:layout_width="fill_parent"

       android:layout_height="fill_parent"/>

 

ListActivity 상속시

<ListView

       android:id="@id/android:list"

       android:layout_width="fill_parent"

       android:layout_height="fill_parent"/>
 

 


 






그외에 java부분에서도 달라집니다 (기본적인 코딩시)

Activity 상속시 함수 사용

  myListView.setAdapter(adapter);

 

ListActivity 상속시

  setListAdapter(adapter);

 

  


 


 


 

ListActivity 를 사용할때는 ListView를 선언해서 사용할 필요가 없습니다
그래서 위에 java코딩부분처럼  
setListAdapter()를 바로 사용할 수있습니다
이런경우 ListView.~~~ 로 접근해서 해더 푸터를 달아야 하는데 달 수 없게 됩니다
그러나 코딩으로 이 부분을 해결 할 수 있습니다









ListActivity에서 ListView를 선언해서 사용하는 방법입니다 
 
myListView = getListView();
 
 ListView에 getListView()를 담아주면 ListActivity에서 Listview를 선언해서 사용할 수 있습니다











 
파일 첨부한 프로젝트의 스샷 입니다

리스트뷰에 더보기 버튼이 구현되어 있습니다
테스트한 소스이기 때문에 좀 지저분하지만 필요하신 분들 받아서 참고 하세요~









 

dongProject2.zip

 



신고





Posted by 파란물
보물창고/Programming2011.08.09 20:27








안드로이드 프로그램을 위해 리스트뷰 레이아웃을 꾸몄습니다
RelativeLayout 를 사용했습니다
위 화면 구성과 같은 내용으로 왼쪽이 이미지 오른쪽에 아이디 내용 시간을 구성했습니다
기본틀은 아래 블로그를 참고하고 제가 원하는대로 수정을 한 코딩 내용 입니다
http://tigerwoods.tistory.com/13





java 코드 입니다

 

package ibm.cw.f5;

import android.app.Activity;

import android.app.ListActivity;

import android.content.Context;

import android.os.Bundle;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.widget.ArrayAdapter;

import android.widget.ImageView;

import android.widget.ListView;

import android.widget.TextView;

public class DongProject1Activity extends ListActivity {

 

       // ListView 뿌릴 Data

       String[] items={ "Android동해물과 백두산이Android동해물과 백두산이", "iPhone동해물과 백두산이동해물과 백두산이", "UI동해물과 백두산이동해물과 백두산이", "Java동해물과 백두산이동해물과 백두산이", "SDK동해물과 백두산이동해물과 백두산이",

                    "Adapter동해물과 백두산이동해물과 백두산이", "List동해물과 백두산이동해물과 백두산이", "This동해물과 백두산이동해물과 백두산이", "is동해물과 백두산이동해물과 백두산이", "Fun동해물과 백두산이동해물과 백두산이" };

       TextView tv;

       /** Called when the activity is first created. */

       @Override

       public void onCreate(Bundle savedInstanceState) {

             super.onCreate(savedInstanceState);

             setContentView(R.layout.main);

 

             // 커스텀 ArrayAdapter 선언/초기화.

             MyArrayAdapter aa = new MyArrayAdapter(this);

 

             // Activity 아답터로 aa 지정.

             setListAdapter(aa);

 

             tv = (TextView)findViewById(R.id.selection);

       }

 

       // ListView 아이템이 클릭되면 호출되는 callback.

       public void onListItemClick(ListView l, View v, int position, long id) {

             tv.setText(items[position]);

       }

 

       // ArrayAdapter에서 상속받는 커스텀 ArrayAdapter 정의.

       class MyArrayAdapter extends ArrayAdapter {

             // 생성자 내부에서 초기화

             Context context;

 

             // 생성자

             MyArrayAdapter(Context context) {

                    super(context, R.layout.row, items);

 

                   // instance 변수(this.context) 생성자 호출시 전달받은 지역 변수(context) 초기화.

                    this.context = context;

             }

 

             // ListView에서 (row) 화면에 표시하기 호출됨.

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

                    // LayoutInflater 객체 inflater 현재 context 연결된 inflater 초기화.

                    LayoutInflater inflater = ((Activity)context).getLayoutInflater();

 

                    // inflator객체를 이용하여 \res\laout\row.xml 파싱

                    View row = (View)inflater.inflate(R.layout.row, null);

 

 

                    //아이디를 담은 공간 생성

                    TextView inName = (TextView)row.findViewById(R.id.idname);

                    inName.setText("  " + "IDtest");

 

                    // TextView 객체 label row 객체 내부에 있는 R.id.label 초기화

                    // 내용 담을 공간

                    TextView label = (TextView)row.findViewById(R.id.label);

                    // label 텍스트 설정.

                    label.setText(" " + items[position]);

 

                    //날짜 시간 담을 공간

                    TextView YyMmDd = (TextView)row.findViewById(R.id.yymmdd);

                    YyMmDd.setText("11 8 8" + "  ");

 

                    // items 배열에서 현제 처리중인 위치의 text 길이가 4 이상이면

                    // 아이콘을 'x' 마크로 변경. 4미만일때는 아무 변화없이 xml layout 초기값인 '첵크'마크 사용됨.

                    if(items[position].length()>4) {

 

                           // 이미지뷰 객체 icon row내부에 정의된 R.id.icon으로 초기화.

                           ImageView icon = (ImageView)row.findViewById(R.id.icon);

 

                           // icon 객체가 표현할 리소스를 'x' 마크(R.drawable.delete) 지정.

                           //     icon.setImageResource(R.drawable.delete);

                           icon.setImageResource(R.drawable.tiger);

 

                    }

 

                    // 커스터마이징 View 리턴.

                    return row;

             }

       };

}


 




main 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"     >

 

       <!-- ListView에서 클릭되는 Item 확인 TextView -->

       <TextView

             android:id="@+id/selection"

             android:layout_width="wrap_content"

             android:layout_height="wrap_content"

             android:text="No Selection"

             android:textColor="#FF0000"

             android:textSize="20px" />

 

       <!-- ListActivity 기본 ListView -->

       <ListView

             android:id="@id/android:list"

             android:layout_width="fill_parent"

             android:layout_height="fill_parent"     />

      

       <!-- ListView 비어있을때(empty) 표현되는 TextView -->

       <TextView

             android:id="@id/android:empty"

             android:layout_width="wrap_content"

             android:layout_height="wrap_content"

             android:layout_gravity="center"

             android:text="No Item" />

 

</LinearLayout>

 




row xml 입니다

 

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

 

<!-- ListView (Row)마다 적용될 layout -->

<RelativeLayout

       xmlns:android="http://schemas.android.com/apk/res/android"

       android:layout_width="match_parent"

       android:layout_height="match_parent" >

 

       <!-- (row) 시작은 ImageView -->

       <ImageView

             android:id="@+id/icon"

             android:src="@drawable/tiger"

             android:layout_width="100px"

             android:layout_height="100px" />

      

             <!-- ImageView 오른편 위에 표시될 아이디 부분 -->

             <TextView

                    android:layout_toRightOf="@id/icon"

                    android:id="@+id/idname"

                    android:layout_width="wrap_content"

                    android:layout_height="wrap_content"

                    android:textSize="25px" />

            

             <!-- ImageView 오른편에 표시 Text -->

             <TextView

                    android:layout_alignLeft="@id/idname"

                    android:layout_below="@id/idname"

                    android:id="@+id/label"

                    android:layout_width="wrap_content"

                    android:layout_height="wrap_content"

                    android:textSize="35px" />

                   

                    <!-- ImageView 오른편에 표시 Text -->

             <TextView

                    android:layout_alignRight="@id/label"

                    android:layout_below="@id/label"

                    android:id="@+id/yymmdd"

                    android:layout_width="wrap_content"

                    android:layout_height="wrap_content"

                    android:textSize="20px" />

                   

</RelativeLayout>

 
 


신고





Posted by 파란물