Android does not provide a mechanism for using a custom font file (TTF, OTF, etc) in all areas of your app. Instead you must employ a strategy to set a custom Typeface on all TextViews, EditTexts, and Buttons.

This post covers a strategy that should handle your needs for common apps.

The View Crawler

Layouts (and sub-layouts) in Android are tree hierarchies comprised of ViewGroups as composite elements and Views as leaf nodes. This tree can be crawled by visiting child views in your favorite order (breadth first or depth first). When crawling this tree, one can replace all the Typefaces on any TextViews, EditTexts, and Buttons that are encountered.

Here is a simple recursive implementation of a view crawler that will replace the Typeface for any appropriate view in the hierarchy:

public class FontChangeCrawler
{
    private Typeface typeface;

    public FontChangeCrawler(Typeface typeface)
    {
        this.typeface = typeface;
    }

    public FontChangeCrawler(AssetManager assets, String assetsFontFileName)
    {
        typeface = Typeface.createFromAsset(assets, assetsFontFileName);
    }

    public void replaceFonts(ViewGroup viewTree)
    {
        View child;
        for(int i = 0; i < viewTree.getChildCount(); ++i)
        {
            child = viewTree.getChildAt(i);
            if(child instanceof ViewGroup)
            {
                // recursive call
                replaceFonts((ViewGroup)child);
            }
            else if(child instanceof TextView)
            {
                // base case
                ((TextView) child).setTypeface(typeface);
            }
        }
    }
}

Replace Entire Activity's Typeface

To replace the default font in every view within an Activity's layout, simply use the FontChangeCrawlerfrom above, like so:

@Override
public void setContentView(View view)
{
    super.setContentView(view);

    FontChangeCrawler fontChanger = new FontChangeCrawler(getAssets(), "font.otf");
    fontChanger.replaceFonts((ViewGroup)this.findViewById(android.R.id.content));
}

If you are not familiar with android.R.id.content, it is the official ID given to the root View within an Activity's layout.

Consider placing the above logic in a BaseActivity class.

Replace Fragment's Typeface

You will need to apply the FontChangeCrawler to each Fragment as well. Consider placing this logic in a BaseFragment class.

@Override
public void onActivityCreated(Bundle savedInstanceState)
{
    super.onActivityCreated(savedInstanceState);

    FontChangeCrawler fontChanger = new FontChangeCrawler(getAssets(), "font.otf");
    fontChanger.replaceFonts((ViewGroup) this.getView());
}

Handle Adapters, etc.

Replacing Activity fonts goes a long way, but most of us also have a plethora of ListViews. The list items in a ListView are built within an adapter, not within an Activity. Therefore, you will also need to use the FontChangeCrawler in your adapters:

...
if(convertView == null)
{
    convertView = inflater.inflate(R.layout.listitem, null);
    fontChanger.replaceFonts((ViewGroup)convertView);
}
...

What's Not Handled?

I will leave handling the ActionBar as an exercise for the reader. Also, consider how you might handle widgets whose typeface you don't want to change.



[출처]

https://coderwall.com/p/qxxmaa/android-use-a-custom-font-everywhere


Posted by 모과이IT
,

The problem is, your project is missing the raster resources for pre-lollipop versions. Check, if you have file values/drawables.xml. It seems like you copied some source, but not this file. The file contains references to raster images, that are used as alternatives to the vector images:


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

<item name="ic_menu_camera" type="drawable">@android:drawable/ic_menu_camera</item>

<item name="ic_menu_gallery" type="drawable">@android:drawable/ic_menu_gallery</item>

<item name="ic_menu_slideshow" type="drawable">@android:drawable/ic_menu_slideshow</item>

<item name="ic_menu_manage" type="drawable">@android:drawable/ic_menu_manage</item>

<item name="ic_menu_share" type="drawable">@android:drawable/ic_menu_share</item>

<item name="ic_menu_send" type="drawable">@android:drawable/ic_menu_send</item>

</resources>



Android lollipop(5.0) 이하 버전에서는 values 폴더에 drawables.xml 파일에 위의 코드가 추가 되어야지

정상적으로 실행이 되어진다.



출처 : https://stackoverflow.com/questions/35673722/binary-xml-file-line-16-error-inflating-class-android-support-design-widget-na

Posted by 모과이IT
,

Android Studio 에서 SVN ignore list 설정하는 방법을 알아봅니다.


(Windows 기준)

Android Studio 메뉴 File -> Settings... -> Version Control -> ignored Files 


우측 Add 버튼을 이용해 아래 항목들을 추가.


Directory: .idea/libraries/ 

Directory: .gradle/

Directory: build/

Directory: app/build/

File: local.properties 

File: app/app.iml

Mask: *.iws 


[출처]

http://blog.naver.com/PostView.nhn?blogId=osh2357&logNo=220906327922&parentCategoryNo=&categoryNo=18&viewDate=&isShowPopularPosts=false&from=postView


Posted by 모과이IT
,

기존에 만들어놓은 Frame이 Activity Base로 되어져 있어서 FragmentActivity 의 속성에서 실행되어지는 라이브러리를 적용해야할 상황이 있었다. 그런 상황에서 AppCompatActivity 란를 보니 위의 두 Activity와 FragmentActivity의 모두 상속한것들이었다. 특히 요즘에 이쁜 UI 라이브러리는 Base class for activities that use the support library action bar features. 의 라이브러리를 사용되어지는것이 많기 때문에 기존 Frame을 AppCompatActivity로 전환은 필연적이었다.







그리고 Frame의 BaseActivity를 기존에 Activity에서 AppCompatactivity로 바꾸었다. 이론적으로 상속개념에서는 위의 Activity와 FragmentActivity의 속성을 모두 사용할수가 있다.


전환방법은


1. BaseActivity의 상속자를 Activity에서 AppCompatActivity로 해주었다.


이것만 해주니 실행할때 Runtime 오류가 났다.


2. android:theme="@style/Theme.AppCompat.NoActionBar" 처리

- AndroidManifest.xml 파일에 <application 영역에서 액션바 속성에 대한 처리가 포함되어지 테마를 설정해주어야지된다. 참고로 기존에 Frame에서 ActionBar는 사용하지 않으므로 NoActionBar처리를 해주었다.


위의 1,2 를 수행해주면  Activity -> AppCompatActivity로 전환해서 사용이 가능하다


Posted by 모과이IT
,
  1. http://www.visualsvn.com/downloads/로 가서 최신 SVN command line tool 다운 .
  2. Android Studio 에 File -> Settings -> Version Control -> Subversion 로 들어가서 Use command line client 에 1.에서 다운로드 받은 폴더의 svn.exe의 경로를 세팅.
  3. 메뉴에서 VCS -> Import into Version Control (다른 폴더의 원본 폴더를 import)
  4. Android Studio를 재시작 하고 VCS -> Check from Version Control -> Subversion 에서 SVN URL을 입력하고 계정 입력후 Check Out버튼 클릭 -> Local 폴더 지정한다 (새로운 Local 폴더를 설정


[참고사이트]
http://chiyo85.tistory.com/93


Posted by 모과이IT
,

안드로이드 Activity 생명주기


1. Activity : 안드로이드 Application 의 기본 단위로, 사용자 인터페이스를 화면에 표시하고 사용자의 입력을받아서 처리하는 역할을 함


2. 생명 주기 (Life cycle) : Activity 는 시작, 실행, 활성, 비활성화, 정지, 종료되는 일련의 상태를 순환


3. system 은 task의 실행중인 Activity들을 stack으로 관리함

  activity 가 새로 생성되면 stack의 제일 위에 놓여 활성화 됨

  이 상태에서 다른 activity 가 또 생성되면, 기존의 activity는 잠시 가려지고 새 activity가 stack의 제일 위에 배치됨

  stack 제일 위의 activity 가 종료되면 바로 아래쪽에 잇는 activity 가 자연스럽게 활성화 될 것임

  stack 의 activity 는 넣고 빼기만 할 뿐 순서가 바뀌지 않음


4. stack activity 의 세가지 상태

   - 실행 (active, running)

     : 사용자가 직접 사용하는 상태. 스택의 제일 위에 있으며 화면상에서도 제일 위에 있음.

       입력 포커스를 가지며, 사용자의 입력을 직접 처리함

   - 일시 정지 (pause)

     : 포커스는 잃었지만 사용자에게는 보이는 상태

      위쪽에 다른 activity 가 있지만, 화면 전체를 다 가리지 않았거나 반투명한 경우가 이에 해당됨.

      살아있는 상태와 같지만 시스템에 의해 강제 종료될 수도 있음

   - 정지 (stoped)

     : 다른 activity 에 의해 완전해 가려진 상태이며, 사용자 눈에 보이지 않음

      그러나 모든 정보를 다 유지하고 있으므로 언제든 다시 활성화 될 수 있음

      system 은 메모리가 부족하면 정지 상태의 activity를 언제든지 강제 종료할 수 있음

 

5. Activity 의 전체 생명주기






- onCreate()

     : activity 를 초기화 함

      중지했다 재시작 하는 경우라면 activity 의 이전 상태 정보인 bundle 이 전달됨. 이정보대로 재초기화 함

 

   - onRestart()

     : 재시작될 때 호출 됨.

       가시 수명으로 이어지기전 acvitity 처리를 위해 호출. 항상 onStart() 호출 직전에 호출됨

 

   - onStart()

     : 액티비티가 사용자에게 보이기 직전에 호출.

 

   - onResume()

     : 사용자와 상효작용을 하기 직전에 호출됨. 이 단계에서 스택의 제일 위로 올라옴

       activity 스택의 맨 위에 있어서 activity 가 사용자에게 보여지고, 사용자의 입력을 처리할 수 있을 때 호출

 

   _ onPause()

     : 다른 activity 가 실행될 때 호출됨.

       이 단계에서 미저장한 데이터가 있으면 저장하고, 애니메이션은 중지해야 함

       이 메서드가 리턴되어야 새 activity 가 활성화 되므로 시간을 너무 많이 끌어서는 안됨

 

       즉, 활성 수명 끝에서 호출 되는데, 포커스를 잃고 이전의 activity 가 resume 되기 전에 호출됨.

       onPause() 에서는 데이터의 저장, 애니메이션의 중지, cpu 를 소비하는 작업 중단과 같은 일들을 수행해야함

       사용자가 activity 를 떠날 때 다루어야 할 매서드임

       application 실행 도중 전화가 걸려오면 그때까지의 내용을 모두 저장해야 하는데, onPause() 에서 이러한 저장과정이 진행됨

 

   - onStop()

     : 더이상activity 가 스택의 최상위에 있지않으므로 사용자에게 보이지 않게 될 때 호출됨

 

   - onDestory()

     : activity 가 파괴될 때 호출됨

       system 에 의해 강제로 종료되는 것인지 아니면 finish 메서드 호출에 의해 스스로 종료하는 것인지는 infinish 메서드로 조사 가능

       onDestory() 메서드가 호출되면 system 에서 activity 가 존재하지 않음


출처 : http://apponline.tistory.com/entry/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9CAndroid-%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-Activity-%EC%83%9D%EB%AA%85%EC%A3%BC%EA%B8%B0




안드로이드 액티비티 생명주기 (Android Activity LifeCycle)

- 액티비티는 효율적인 메모리 관리를 위해 생성, 소멸되는 조건인 생명주기를(Lifecycle) 가지고 있다

- 생명주기는 7가지 단계로 구분되며 다음 순서를 기본으로 진행된다
  onCreate(), onStart(), onResume(), onPause(), onStop(), onRestart() 또는 onDestroy()

- 각 상태에 따라 필요한 작업을 메소드를 오버라이드 하여 처리해주면 된다

- 여러개의 액티비티를 이용중 시스템의 리소스가 부족하면 다음상태의 액티비티를 강제로 종료시킨다
  onDestroy() - 1순위, onStop() - 2순위, onPause() - 3순위

- onPause() 상태의 Callback은(실행완료) 보장하지만, onStop()과 onDestroy()는 보장할 수 없다
  (미완료 상태에서 System이 강제종료 시킬 수 있으므로 되도록 onPause()에서 종료를 대비 해야한다)

- 강제종료된 Activity는 리소스가 확보되면 다시 복구 시킨다

- 강제종료시에는 데이터 복원를 대비하여 onPause() 실행 전 onSaveInstanceState(Bundle b) 를 실행시킨다

- 강제종료시에는 onStart() 호출 후 실행되는 onRestoreInstanceState(Bundle b) 또는 
  onCreate(Bundle b) 를 사용하여 복원작업을 수행할 수 있다

- 화면의 Orientation(가로/세로) 변경시 onDestroy()를 호출 후 onCreate()가 실행된다

 

- onCreate()
액티비티가 처음 생성될때와(화면이 회전되어 orientation이 변경될때도 기본으로 실행) 실행되며
레이아웃배치와 변수선언 등 각종 초기화 작업을 구현하는 단계이다
완료 후 onStart()를 호출한다

- onStart()
onCreate() 이후 또는 onRestart()로 다시 시작된 후 처음으로 호출하는 단계이며
화면생성이 완료되고 사용자 입력을 받기 바로 직전의 단계이다
완료 후 onResume()를 호출한다

- onResume()
onResume() 이 실행되면 상호작용이 가능하며 모든준비가 완료되고 액티비티가 완벽하게 활성 상태가 된다.
onPause()에서 다시 시작되었을때 호출하는 단계이기도 하다

- onPause()
상태에서 다른 Activity에 포커스를 넘겨준 후 비활성화(background) 되며 상호작용이 중단된 단계이다
이 상태 이후부터는 언제든지 시스템의 강제종료가 가능하며 이 상태가 완료 되어야 다음 Activity가
활성화(foreground) 되고 이후 이 액티비티는 onStop() 상태가 된다
단, 다음 Activity 의 테마가 translucent 인 투명한 배경의 Activity 와 같이 풀스크린이 아닌
Activity일 경우에는 onStop() 상태가 되지 않고 onPause()를 유지한다
하나 더 덧붙이면, 투명배경의 Activity와 비슷한 Diaglog 의 경우에는 onPause()가 적용되지 않는다

- onStop()
Activity가 사용자에게 보이지 않는 비활성화 상태로 돌아서게 되면 호출하는 단계이다
=> 다른 activity 를 활성화 시켰을때는 background로 onStop() 상태가 유지되며,
=> 현 액티비티에서 finish()를 호출하거나 back key를 이용해 home activity로 돌아갈때는
onStop() 후 onDestroy()를 호출하고
=> 다음 Activity에서 back 하여 현 액티비티로 돌아올때는 onRestart(), onStart(), onResume 순으로 호출한다

- onDestroy()
finish(), finishActivity() 같은 정상적인 종료시에 호출되며, onCreate()에서 호출한 자원의 반납등을 하는 단계이다

- onRestart()
onStop()인 비활성화 상태에서 다시 활성화되는 단계에서 발생한다


Posted by 모과이IT
,


ListdataReply.java


public class ListDataReply {


    String num;

    String id;

    String text;

    String time;

    String psurl;


    public ListDataReply(String num, String id, String text, String time, String psurl) {

        this.num = num;

        this.id = id;

        this.text = text;

        this.time = time;

        this.psurl = psurl;

    }


    public String getNum() {

        return num;

    }


    public void setNum(String num) {

        this.num = num;

    }


    public String getId() {

        return id;

    }


    public void setId(String id) {

        this.id = id;

    }


    public String getText() {

        return text;

    }


    public void setText(String text) {

        this.text = text;

    }


    public String getTime() {

        return time;

    }


    public void setTime(String time) {

        this.time = time;

    }


    public String getPsurl() {

        return psurl;

    }


    public void setPsurl(String psurl) {

        this.psurl = psurl;

    }

}



ReplyListAdapter.java


package com.src.ReviewBBS;


import java.util.ArrayList;

import java.util.Collections;


import android.view.View;

import android.view.ViewGroup;


import com.widget.InfiniteScrollListAdapter;

public class ReplyListAdapter extends InfiniteScrollListAdapter {


    // A placeholder for all the data points

    private ArrayList<ListDataReply> entries = new ArrayList<ListDataReply>();

    private NewPageListener newPageListener;


    // A demo listener to pass actions from view to adapter

    public static abstract class NewPageListener {

        public abstract void onScrollNext();

        public abstract View getInfiniteScrollListView(int position, View convertView, ViewGroup parent);

    }


    public ReplyListAdapter(NewPageListener newPageListener) {

        this.newPageListener = newPageListener;

    }


    public void addEntriesToTop(ArrayList<ListDataReply> entries) {

        // Add entries in reversed order to achieve a sequence used in most of messaging/chat apps

        if (entries != null) {

            Collections.reverse(entries);

        }

        // Add entries to the top of the list

        this.entries.addAll(0, entries);

        notifyDataSetChanged();

    }


    public void addEntriesToBottom(ArrayList<ListDataReply> entries) {

        // Add entries to the bottom of the list

        this.entries.addAll(entries);

        notifyDataSetChanged();

    }


    public void clearEntries() {

        // Clear all the data points

        this.entries.clear();

        notifyDataSetChanged();

    }


    @Override

    public int getCount() {

        return entries.size();

    }


    @Override

    public Object getItem(int position) {

        return entries.get(position);

    }


    @Override

    public long getItemId(int position) {

        return position;

    }


    @Override

    public void onScrollNext() {

        if (newPageListener != null) {

            newPageListener.onScrollNext();

        }

    }


    @Override

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

        if (newPageListener != null) {

            return newPageListener.getInfiniteScrollListView(position, convertView, parent);

        }

        return convertView;

    }


}



ReviewViewReplyActivity.java


public class ReviewViewReplyActivity extends BaseActivity {


    ////////////////////////// <infinelistScrollsview> start ///////////////////////////////////////

    ArrayList<ListDataReply> moguwaiEntries;

    private ReplyListAdapter replyListAdapter;

    static DrawableManager DM = new DrawableManager();

    private static final int SEVER_SIDE_BATCH_SIZE = 10;

    private InfiniteScrollListView demoListView;

    private BogusRemoteService bogusRemoteService;

    private Handler handler;

    private AsyncTask<Void, Void, Void> fetchAsyncTask;

    ////////////////////////// <infinelistScrollsview> end ///////////////////////////////////////


.......................(중략)

}


   @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        moguwaiListScrollsview();


................(중략)

    }


   public void moguwaiListScrollsview(){



        ////////////////////////////////////////////

        handler = new Handler();


        demoListView = (InfiniteScrollListView) this.findViewById(R.id.listview_review);


        LayoutInflater layoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        demoListView.setLoadingView(layoutInflater.inflate(R.layout.loading_view_demo, null));

        replyListAdapter = new ReplyListAdapter(new ReplyListAdapter.NewPageListener() {

            @Override

            public void onScrollNext() {

                Util.log("moguwai","===========> onScrollNext()22 <==========");

                fetchAsyncTask = new AsyncTask<Void, Void, Void>() {

                    @Override

                    protected void onPreExecute() {

                        // Loading lock to allow only one instance of loading

                        replyListAdapter.lock();

                    }

                    @Override

                    protected Void doInBackground(Void ... params) {

                        Util.log("moguwai","===========> onScrollNext()11 <==========");

                        //String temp = params[0];

                        // Mimic loading data from a remote service


                        // 이부분 거창하게 클래스에 이런 함수 쓸필요없이

                        //

                        Util.log("moguwai","===========> onScrollNext()55 <==========");

                        //result = getDBtoArray(iPage);

                        Util.log("moguwai","===========> onScrollNext()66 <==========");

                        //iPage+=10;

                        //return result;

                        return null;

                    }

                    @Override // jimin

                    protected void onPostExecute(Void result2) { // 추가하는부분

                        Util.log("moguwai", "===========> onPostExecute 시작<==========");

                        Util.log("moguwai","===========>iState<===["+iState);

                        // ArrayList<ListDataReview> result;


                        switch(iState){

                            case 0:


                                getListview(0);



                                break;


                        }





                    };

                    @Override

                    protected void onCancelled() {

                        // Tell the adapter it is end of the list when task is cancelled

                        replyListAdapter.notifyEndOfList();

                    }

                }.execute();

            }

            @Override

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

                // Customize the row for list view

                if(convertView == null) {

                    LayoutInflater layoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);

                    convertView = layoutInflater.inflate(R.layout.row_reply, null);

                }

                ListDataReply name = (ListDataReply) replyListAdapter.getItem(position);

                if (name != null) {

                    TextView rowText = (TextView) convertView.findViewById(R.id.row_text2);

                    ImageView rowPsurl = (ImageView) convertView.findViewById(R.id.row_psurl2);

                    TextView rowTime = (TextView) convertView.findViewById(R.id.row_time2);

                    TextView rowId = (TextView) convertView.findViewById(R.id.row_id2);


                    //row_id row_catalog

                    //row_time



                    // 실제 Card에 Display하는 부분

                    rowId.setText(name.getId());

                    rowText.setText(name.getText());

                    DM.fetchDrawableOnThread(name.getPsurl(), rowPsurl);  //비동기 이미지 로더

                    rowTime.setText(name.getTime());





                }

                return convertView;

            }

        });

        demoListView.setAdapter(replyListAdapter);

        // Display a toast when a list item is clicked

        demoListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {


            public void onItemClick(AdapterView<?> parent, View view, final int position, long id) {


                boolean post = handler.post(new Runnable() {

                    @Override

                    public void run() {

                        ListDataReply name = (ListDataReply) replyListAdapter.getItem(position);

                        // Toast.makeText(YouTubeActivity.this, name.getTitle() + " " + getString(R.string.ordered), Toast.LENGTH_SHORT).show();



                        String strGetID = name.getId();

                        String strGetTitle = name.getText();

                        String strUrl = name.getPsurl();

                        String strNum = name.getNum();

                        // 새로 추가

                        String strPsurl = name.getPsurl();

                        String strTime = name.getTime();


                        String strText = name.getText();

                        // hXBBH3aN0LA

                        Log.d("moguwai", "strGetID = " + strGetID);

                        Log.d("moguwai", "strGetTitle = " + strGetTitle);

                        Log.d("moguwai", "strNum= " + strNum);

                        Log.d("moguwai", "strPsurl= " + strPsurl);

                        Log.d("moguwai", "strTime= " + strTime);


                        Log.d("moguwai", "strText= " + strText);



                    }

                });

            }

        });

    }

    public void getListview(int iNum){

        String strUrl="";

        ArrayList<ListDataReply> result;

        switch(iNum)

        {

            case 0: // 전체

                strUrl="http://121.182.120.85/getreviewlist1.php?page=";

                break;


        }



        result = getDBtoArray(iPage,strUrl);

        iPage += 10;

        if (result == null || result.isEmpty()) {

            replyListAdapter.notifyEndOfList();


        } else {


            // List

            replyListAdapter.addEntriesToBottom(result);


            // Add or remove the loading view depend on if there might be more to load

            if (result.size() < SEVER_SIDE_BATCH_SIZE) {

                replyListAdapter.notifyEndOfList();

            } else {

                replyListAdapter.notifyHasMore();

            }

            // Get the focus to the specified position when loading completes

        } // else


        Util.log("moguwai", "===========> onPostExecute 끝<==========");

    }

    public ArrayList<ListDataReply> getDBtoArray(int page,String strUrl){

        ArrayList<ListDataReply> tempEntries = new ArrayList<ListDataReply>();



        String strRet="";

        strRet = requestDataForServer(1, strUrl+page, this);


        String num="";

        String psurl="";

        String id="";

        String time="";

        String text="";

        JSONArray ja = null;

        try {

            Util.log("moguwai","===========> Debug1");

            ja = new JSONArray(strRet);

            Util.log("moguwai","===========> Debug2");

        } catch (JSONException e) {

            e.printStackTrace();

            Util.log("moguwai", "===========> Debug3");

        }

        Log.d("moguwai", "ja.length()="+ja.length());

        for(int i=0;i<ja.length();i++)

        {

            JSONObject obj = null;

            try {

                obj = ja.getJSONObject(i);

                num = obj.getString("num");

                psurl = obj.getString("psurl");

                Log.d("moguwai", "psurl: "+i+"번째 :"+psurl);

                id = obj.getString("id");

                time = obj.getString("time");

                text = obj.getString("text");



            } catch (JSONException e) {

                e.printStackTrace();

            }


            ListDataReply tempList1 =  new ListDataReply(num,id,text,time,psurl);

            tempEntries.add(tempList1);

        }


        return tempEntries;

    }


 public void getListFromDB(int State){

        iState =State;

        replyListAdapter.onScrollNext();

    }

    public void resetListview(){

        ///// 전에꺼 지우는 코드

        iPage=0;

        replyListAdapter.clearEntries();

        replyListAdapter.notifyEndOfList();

        ////////////////////////////

    }


    @Override

    protected void onResume() {

        super.onResume();

        Log.d("moguwai", "onResume()");

        resetListview();

        getListFromDB(0);

        //reviewListAdapter.onScrollNext();

    }


row.reply.xml


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

    xmlns:tools="http://schemas.android.com/tools"

    android:layout_width="match_parent"

    android:paddingTop="5dp"

    android:paddingBottom="5dp"

    android:paddingLeft="10dp"

    android:paddingRight="5dp"

    android:layout_height="100dip"

    android:background="#ffffff"

    android:orientation="horizontal" >


    <LinearLayout

        android:layout_width="0dip"

        android:layout_height="100dip"

        android:layout_weight="1.5"

        android:orientation="horizontal" >


        <ImageView

            android:id="@+id/row_psurl2"

            android:layout_width="match_parent"

            android:layout_height="match_parent" >

        </ImageView>

    </LinearLayout>


    <LinearLayout

        android:layout_width="0dip"

        android:layout_height="100dip"

        android:layout_weight="4"

        android:weightSum="1"

        android:orientation="vertical" >


        <LinearLayout

            android:layout_width="match_parent"

            android:layout_weight="0.35"

            android:layout_height="0dip"

            android:weightSum="1"

            android:orientation="horizontal" >


            <LinearLayout

                android:layout_width="0dip"

                android:layout_weight="0.25"

                android:layout_height="match_parent"

                android:orientation="horizontal" >

                <TextView

                    android:id="@+id/row_id2"

                    android:textColor="#000000"

                    android:layout_width="match_parent"

                    android:layout_height="match_parent"

                    android:text="아이디"

                    android:textSize="11dp"

                    android:singleLine="true"

                    >

                </TextView>




            </LinearLayout>



            <LinearLayout

                android:layout_width="0dip"

                android:layout_weight="0.75"

                android:layout_height="match_parent"

                android:orientation="horizontal" >

                <TextView

                    android:id="@+id/row_time2"

                    android:textColor="#000000"

                    android:layout_width="match_parent"

                    android:layout_height="match_parent"

                    android:text="시간"

                    android:textSize="11dp"

                    android:singleLine="true"

                    >

                </TextView>




            </LinearLayout>


        </LinearLayout>

        <LinearLayout

            android:layout_width="match_parent"

            android:layout_weight="0.65"

            android:layout_height="0dip"

            android:orientation="horizontal" >

            <TextView

                android:id="@+id/row_text2"

                android:textColor="#000000"

                android:layout_width="match_parent"

                android:layout_height="match_parent"

                android:text="본문"

                >

            </TextView>



        </LinearLayout>



    </LinearLayout>


</LinearLayout>



[Github 필요한 파일 추출]

modifybymoguwai.zip



Posted by 모과이IT
,

///////////////////////////// 주소록 시도, 구군 2단계 //////////////////////

String [] strSido={"서울","부산","대구","인천","광주","대전","울산","강원","경기","경남","경북","전남","전북","제주","충남","충북"};
String [][] strGugun= { {"강남구","강동구","강북구","강서구","관악구","광진구","구로구","금천구","노원구","도봉구","동대문구","동작구","마포구","서대문구","서초구","성동구","성북구","송파구","양천구","영등포구","용산구","은평구","종로구","중구","중랑구"},
{"강서구","금정구","남구","동구","동래구","부산진구","북구","사상구","사하구","서구","수영구","연제구","영도구","중구","해운대구","기장군"},
{"남구","달서구","동구","북구","서구","수성구","중구","달성군"},
{"계양구","남구","남동구","동구","부평구","서구","연수구","중구","강화군","옹진군"},
{"광산구","남구","동구","북구","서구"},
{"대덕구","동구","서구","유성구","중구"},
{"남구","동구","북구","중구","울주군"},
{"강릉시","동해시","삼척시","속초시","원주시","춘천시","태백시","고성군","양구군","양양군","영월군","인제군","정선군","철원군","평창군","홍천군","화천군","횡성군"},
{"고양시 덕양구","고양시 일산동구","고양시 일산서구","과천시","광명시","광주시","구리시","군포시","김포시","남양주시","동두천시","부천시 소사구","부천시 오정구","부천시 원미구","성남시 분당구","성남시 수정구","성남시 중원구","수원시 권선구","수원시 영통구","수원시 장안구","수원시 팔달구","시흥시","안산시 단원구","안산시 상록구","안성시","안양시 동안구","안양시 만안구","양주시","오산시","용인시 기흥구","용인시 수지구","용인시 처인구","의왕시","의정부시","이천시","파주시","평택시","포천시","하남시","화성시","가평군","양평군","여주군","연천군"},
{"거제시","김해시","마산시","밀양시","사천시","양산시","진주시","진해시","창원시","통영시","거창군","고성군","남해군","산청군","의령군","창녕군","하동군","함안군","함양군","합천군"},
{"경산시","경주시","구미시","김천시","문경시","상주시","안동시","영주시","영천시","포항시 남구","포항시 북구","고령군","군위군","봉화군","성주군","영덕군","영양군","예천군","울릉군","울진군","의성군","청도군","청송군","칠곡군"},
{"광양시","나주시","목포시","순천시","여수시","강진군","고흥군","곡성군","구례군","담양군","무안군","보성군","신안군","영광군","영암군","완도군","장성군","장흥군","진도군","함평군","해남군","화순군"},
{"군산시","김제시","남원시","익산시","전주시 덕진구","전주시 완산구","정읍시","고창군","무주군","부안군","순창군","완주군","임실군","장수군","진안군"},
{"제주시","서귀포시"},
{"계룡시","공주시","논산시","보령시","서산시","아산시","천안시 동남구","천안시 서북구","금산군","당진군","부여군","서천군","연기군","예산군","청양군","태안군","홍성군"},
{"제천시","청주시 상당구","청주시 흥덕구","충주시","괴산군","단양군","보은군","영동군","옥천군","음성군","증평군","진천군","청원군"}
};


Posted by 모과이IT
,

1) php 코드 파일 소스


<?php


header("Content-Type: text/html; charset=UTF-8");


?>


<script src="http://dmaps.daum.net/map_js_init/postcode.v2.js"></script>

<script>

    new daum.Postcode({

        oncomplete: function(data) {

    

if(data.userSelectedType=="R"){

window.SmartKiKiApp.testMove(data.zonecode, data.roadAddress);

}

else{

window.SmartKiKiApp.testMove(data.zonecode, data.jibunAddress);

}

    

        }

    }).open();

</script>


2) android 소스

// 주소검색관련
Dialog dialogWeb;
private final Handler handler = new Handler();
private class AndroidBridge {
public void testMove(final String arg1,final String arg2) { // must be final
handler.post(new Runnable() {
@Override
public void run() {
// 원하는 동작
Log.d("moguwai","핸들러 호출!!");
Log.d("moguwai",arg1);Log.d("moguwai",arg2);
etZipcode1.setText(arg1);etZipcode2.setText(arg2);
dialogWeb.dismiss();
//mWebView.loadUrl(arg);
}
});
}
}

public void init(){

...........
dialogWeb = new Dialog(this);// WebDialog 초기화

.....

}

@Override
public void onClick(View v) {

...........

case R.id.btn_zipsearch:
Util.Toast(this, "검색버튼 클릭");
dialogWeb.setContentView(R.layout.web_dialog);
WebView wb = (WebView) dialogWeb.findViewById(R.id.webview);
wb.getSettings().setJavaScriptEnabled(true);
// wb.getSettings().setJavaScriptEnabled(true);
wb.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
wb.addJavascriptInterface(new AndroidBridge(), "SmartKiKiApp");

// wb.setWebViewClient(new MyWebViewClient());
wb.setWebChromeClient(new WebChromeClient());
wb.loadUrl("http://121.182.120.85/jimin.php");
dialogWeb.setCancelable(true);
dialogWeb.setTitle("주소검색");
dialogWeb.show();
break;
..............
}


Posted by 모과이IT
,

상식적이지만 의외로 이것때문에 삽질을 하였다.


1) 안드로이드 프로젝트 파일

2) php 프로젝트 파일

3) mysql DB서버


3곳 모두 같은 인코딩 이어야지 된다. 그러면 프로그래밍적으로 어느곳에서서든 utf8로 변환 하거나 그럴 필요

자체가 없는것이다. 그런걸 감안해서 안드로이드이드 혹은 php 코딩일하는 파일의 인코딩 방식이 일치하는지

확인해야한다. 참고로 필자는 php코드를 notepad++에서 기본 "ANSI"로 되어진것을 utf8로 인코딩 covert를 하지 않고 웹에서 한글이 깨어져서 순간 당황했던 경험이 있다. 


Posted by 모과이IT
,