ListView를 가지는 Fragment 만들기. (Android ListFragment)

2016. 6. 9. 09:48


1. Fragment와 ListView

Fragment를 사용하여 UI를 구성하면, 화면을 모듈 단위로 나누어 작성하기 편하고, 한번 만들어진 Fragment를 재사용할 수 있으며, 다양한 해상도 및 화면 모드에서 유연하게 동작하는 앱을 작성할 수 있습니다. 이러한 여러 가지 장점을 가진 Fragment가 가장 많이 활용되는 경우는, ListView를 사용하여 목록(메뉴) 형태의 UI를 제공하는 앱을 개발할 때 입니다.


[안드로이드 프래그먼트 기본 사용법]에서 살펴봤듯이, Fragment를 사용하여 UI를 구성하는 것은 그리 복잡한 작업이 아닙니다. Activity에서 UI를 구성하는 것과 유사한 방법으로 화면을 표시할 수 있죠.
ListView를 사용하여 목록(메뉴) 형태의 UI를 만드는 방법 또한 마찬가지입니다. [안드로이드 리스트뷰 기본 사용법]에서 Activity에 ListView를 만드는 방법과 Fragment에 ListView를 사용할 때의 주의 사항을 설명하였으니, 충분히 참고가 되리라 생각됩니다.


그런데 안드로이드에서는, 친절하게도, ListView를 포함하는 Fragment를 별도의 클래스로 제공하고 있습니다. ListFragment라는 꽤 직관적인 이름으로 말이죠. ListFragment를 사용하면 ListView를 일일이 만들 필요 없이, ListFragment에서 제공하는 함수들을 사용해서 ListView가 표시되는 Fragment를 만들 수 있습니다.


ListFragment



2. ListFragment를 사용하여 간단한 ListView(텍스트만 표시) 만들기

[안드로이드 리스트뷰 기본 사용법]에서, 안드로이드에서 제공하는 가장 기본적인 형태(TextView만 표시)의 ListView를 만드는 방법에 대해 살펴보았습니다. 여기서는 ListFragment를 사용하여 그것과 동일한 기능을 수행하는 예제를 만들어 보겠습니다.


ListFragment를 사용한다고 해서 일반적인 Fragment 사용법의 범위를 벗어난, 대단한 작업이 필요한 것은 아닙니다. [안드로이드 프래그먼트 기본 사용법]에서 설명한 방법들이 유사하게 적용됩니다.


2.1 워크 플로우

ListFragment 작성 절차


2.2 Activity에 ListFragment 추가.

Activity에 ListFragment를 출력하기 위해 Activity의 Layout 리소스 XML에 아래의 내용을 작성합니다.


[STEP-1] "activity_main.xml" - MainActivity에 Fragment 추가. 
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context="com.recipes4dev.examples.listfragmentexample1.MainActivity"
    tools:showIn="@layout/activity_main">

    <fragment
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/menulistfragment"
        android:name="com.recipes4dev.examples.listfragmentexample1.MenuListFragment"
        tools:layout="@layout/activity_main" />

</RelativeLayout>


Fragment를 Layout 리소스 XML에 직접 추가해서 사용하기 위해서는 Fragment의 "android:name" 속성에 Fragment의 클래스를 지정해야 합니다. 다음 단계에서 추가할 클래스 이름을 여기에 지정하면 됩니다.


사실 여기서 "android:name"에 지정되는 클래스를 새로 생성하는 클래스가 아닌 "android.support.v4.app.ListFragment"로 해도 방법 상에 문제는 없습니다. 하지만, ListView 클릭 이벤트를 처리하기 위해서 onListItemClick() 함수를 override해야 하기 때문에 ListFragment를 상속받는 새로운 클래스를 추가하는 것입니다.

ListFragment를 사용할 때 Fragment위에 표시될 Layout 리소스 XML을 반드시 작성해야 하는 것은 아닙니다. ListFragment 자체적으로 ListView를 가지고 있기 때문에, 이미 Layout 리소스 XML을 가지고 있는 것이죠.


2.3 ListFragment 상속 및 구현.

ListFragment를 상속받은 클래스를 MenuListFragment라는 이름으로 추가합니다.


[STEP-2] "MenuListFragment.java" - ListFragment 클래스 상속. 
import android.support.v4.app.ListFragment;

public class MenuListFragment extends ListFragment {
    // TODO
}


안드로이드 스튜디오에서 클래스를 추가할 때, 이미 만들어진 템플릿을 적용하여 Fragment 클래스를 생성할 수 있습니다. 하지만 여기서는 기본적인 내용 설명을 위해 템플릿 코드 없이 클래스를 추가하였습니다.

2.4 ListFragment의 ListView에 데이터 추가.

[안드로이드 리스트뷰 기본 사용법]에서는 ListView에 데이터를 추가할 때, 아래의 코드 내용처럼 Adapter를 생성한 다음 ListView의 setAdapter() 함수를 호출하였습니다.


    ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, LIST_MENU) ;

    ListView listview = (ListView) findViewById(R.id.listview1) ;
    listview.setAdapter(adapter) ;


하지만 ListFragment에서는 위의 코드 대신 ListFragment에서 제공하는 함수를 사용하여 Adapter를 지정합니다. 사용하는 함수 이름은 setListAdapter() 입니다.


[STEP-3] "MainActivity.java" - onCreate() 함수에서 ListFragment에 Adapter 적용.
public class MainActivity extends AppCompatActivity {
    static final String[] LIST_MENU = {"LIST1", "LIST2", "LIST3"} ;
    // ... 코드 계속

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // 코드 계속 ...

        ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, LIST_MENU) ;

        ListFragment menuListFrgmt = (ListFragment) getSupportFragmentManager().findFragmentById(R.id.menulistfragment);
        menuListFrgmt.setListAdapter(adapter) ;
    }
}


기초적인 설명을 덧붙이자면, Activity에서 Layout 리소스 XML에 정의된 Fragment의 참조를 가져오려면 FragmentManager를 사용해야 합니다. 즉, 일반적인 View위젯을 가져올 때 사용했던 findViewById()함수는 사용할 수 없고, FragmentManager의 findFragmentById() 함수를 사용해야 하는 것입니다.
그럼 Activity에서 FragmentManager를 가져오려면 어떻게 해야 할까요? 예제 코드에 있는 것처럼 getSupportFragmentManager()함수를 사용하면 됩니다.


Activity의 getSupportFragmentManager() 함수를 호출하여 FragmentManager의 참조를 획득한 다음, FragmentManager의 findFragmentById() 함수를 호출하여 Fragment의 참조를 가져오는 것이죠.


여기서 한 가지 주의해야 할 것은 getSupportFragmentManager() 함수에서 "Support" 라는 이름입니다. [STEP-2]에서 추가한 MenuListFragment는 "android.support.v4.app.ListFragment"를 상속하였습니다. 그렇기 때문에 getSupportFragmentManager() 함수를 사용한 것이죠. 만약 Support Library가 아닌 "android.app.ListFragment"를 사용한다면 getFragmentManager() 함수를 사용해야 합니다.


2.5 ListFragment의 ListView 아이템 클릭 이벤트 처리.

[안드로이드 리스트뷰 기본 사용법]에서 ListView 아이템에 대한 클릭 이벤트를 처리하는 코드는 OnItemClickListener를 생성하여 ListView의 setOnItemClickListener() 함수에 전달하는 방법이었습니다.


하지만 ListFragment에서는 별도의 리스너를 만들지 않고,  onListItemClick() 이라는 함수를 override하면 됩니다.


[STEP-4] "MenuListFragment.java" - ListFragment의 onListItemClick() 함수 override.
public class MenuListFragment extends ListFragment {

    @Override
    public void onListItemClick (ListView l, View v, int position, long id) {
        // get TextView's Text.
        String strText = (String) l.getItemAtPosition(position) ;
        // TODO
    }
}


onListItemClick() 함수의 파라미터는 ListView 클릭 리스너의 onItemClick() 함수와 동일하므로 ListView의 클릭 이벤트를 다루는 방법과 동일하게 처리할 수 있습니다.

2.6 ListFragment와 간단한 ListView 예제 실행 화면.

아래는 예제 실행 화면입니다. [안드로이드 리스트뷰 기본 사용법]에서 작성했던 예제와 실행 결과가 동일한 것을 확인할 수 있습니다.

ListFragment 예제 실행 화면


3. 참고.

.END.


ANDROID 프로그래밍/FRAGMENT , , , , , , , ,

  1. Blog Icon
    초보어플만들기

    분명히 똑같이 했는데.... 디버그 하면 어플리케이션이 종료됩니다.
    s7에서 디버그 햇어요

  2. 아래 올려주신 에러 메시지를 확인하면, 코드 작성할 때 빠진 부분이 있는 것 같습니다.

    아래 에러 메시지를 올려주신 질문글의 댓글을 확인해주세요.

  3. Blog Icon
    초보어플만들기

    D/AndroidRuntime: Shutting down VM
    E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.steel.myapplication, PID: 31257
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.steel.myapplication/com.example.steel.myapplication.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v4.app.ListFragment.setListAdapter(android.widget.ListAdapter)' on a null object reference
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3254)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3350)
    at android.app.ActivityThread.access$1100(ActivityThread.java:222)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1795)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:158)
    at android.app.ActivityThread.main(ActivityThread.java:7229)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
    Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v4.app.ListFragment.setListAdapter(android.widget.ListAdapter)' on a null object reference
    at com.example.steel.myapplication.MainActivity.onCreate(MainActivity.java:19)
    at android.app.Activity.performCreate(Activity.java:6876)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1135)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3207)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3350) 
    at android.app.ActivityThread.access$1100(ActivityThread.java:222) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1795) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:158) 
    at android.app.ActivityThread.main(ActivityThread.java:7229) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 
    I/Process: Sending signal. PID: 31257 SIG: 9
    Disconnected from the target VM, address: 'localhost:8600', transport: 'socket'

  4. 올려주신 에러 메시지의 핵심 내용은 아래의 내용입니다.

    Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v4.app.ListFragment.setListAdapter(android.widget.ListAdapter)' on a null object reference

    본문 예제의 소스 내용을 그대로 작성하셨다고 하셨으니, MainActivity의 onCreate() 함수를 그대로 옮기셨을 것 같은데요..
    에러가 의미하는 내용은 ListFragment의 참조를 가져와서, setListAdapter() 함수를 호출할 때 setListAdapter() 함수를 실행할 객체의 참조가 잘못되었다는 것입니다.
    예제에서는, [STEP-3]의 내용 중,

    ListFragment menuListFrgmt = (ListFragment) getSupportFragmentManager().findFragmentById(R.id.menulistfragment);

    이 부분이죠.

    [STEP-1]의 XML 파일 내용과 [STEP-2]의 Java 코드를 다시 한번 확인해 보시길 바랍니다.
    분명 예제에서 작성한 내용에서 빠진 부분이 있을 것이라 생각되네요.

    잘 안되면 다시 질문 글 남겨주세요.
    감사합니다.

  5. Blog Icon
    초보어플만들기

    감사합니다. 덕분에 잘 해결했고, 또 하나 배워가게 됩니다.

  6. 도움이 되었다니 다행이네요.
    방문해 주셔서 감사합니다.

  7. Blog Icon
    안녕하세요

    안녕하세요 너무 감사한데요 한가지 질문이 있습니다.
    꼭 import android.support.v4.app.ListFragment 를 해야하나요?
    그거 import 하니 프래그먼트를 불러오려는 액티비티에 있는 FragmentManager 나 Transation 이랑 맞지가 않네요 ㅜㅜ
    한가지 더 질문이 있는데 리스트뷰 어댑터또한 꼭 프래그먼트 onCreateView()에서 써야하나요?
    액티비티에 있는 onCreate()에서 하는 방법은 없을까요? ㅠㅠ

  8. 제가 예제에서 사용한 ListFragment 클래스는 android.support.v4.app.ListFragment 입니다. 하위 버전의 안드로이드에서도 ListFragment를 문제 없이 사용하기 위해 Support Library에 들어 있는 ListFragment를 사용한 것인데요.
    이 때 당연히 Manager나 Transaction도 Support Library에 있는 것을 써야 하죠.

    그리고 또 다른 ListFragment로는 android.app.ListFragment가 있습니다.

    그런데 "안녕하세요" 님께서는 아마 이 두 가지를 혼용해서 쓰신 것 같네요. 즉, Manager와 Transaction은 android.app 패키지를 사용하고 ListFragment는 android.support.v4.app 패키지에 있는 것을 사용하신 듯 하네요. 둘 중에 하나로 통일하시면 문제가 해결되실 것입니다.

    두 번째 질문에 대한 내용은 질문하신 의도가 잘 이해되지 않네요. 음, 일단 반드시 프래그먼트의 onCreateView() 에서 어댑터를 쓸 필요는 없지만, 그렇다고 굳이 액티비티의 onCreate() 함수에서 쓸 이유는 없거든요.

    만들고 계시는 앱의 구조를 몰라서 확답을 드리는 건 섣부른 행동이라... 어쨌든 블로그의 리스트뷰 관련 예제를 같이 살펴보시면 원하시는 결과를 얻으실 수 있을 것이라 생각됩니다.

    또 다른 질문 사항 생기면 질문 글 남겨주세요.

    감사합니다.

  9. Blog Icon
    lhb2435

    public class MenuListFragment extends ListFragment {

    @Override
    public void onListItemClick (ListView l, int position, long id) {
    String strText = (String) l.getItemAtPosition(position);
    Toast.makeText(getActivity(), strText, Toast.LENGTH_SHORT).show();
    }
    }

    여기서 Override가 안되는 이유는 뭘까요 뭔가 버전의 문제라던가 그런건가요..?
    Method does not override method from its superclass라고 뜨는데..
    오타났을까봐 ListFragment 정의된 부분가서 저 메소드 선언부 복사해서 했는데도 안되네요..

  10. Blog Icon
    lhb2435

    아 다시 해보니까 되네요 죄송합니다;

  11. onListItemClick() 함수의 파라미터는 아래 함수 프로토타입과 같이 4개입니다.

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

    그런데 작성하신 코드에서는 두 번째 "View v"가 없네요. 다시 한번 코드를 확인해보시기 바랍니다.

    다른 궁금한 내용 있으시면 글 남겨주세요.

    감사합니다.

  12. 답글 다는 사이에 해결하셨군요~ ^^
    도움 필요하시면 언제든 질문글 남겨주세요.
    감사합니다.

  13. Blog Icon
    wacki

    https://developer.android.com/reference/android/app/ListFragment.html

    잘못사용하시고 있으신거 같네요 한번 확인해 주시겠어요?

  14. 어떤 부분에서 잘못 사용하고 있다고 생각하신 건가요? 조금 더 구체적인 부분을 언급해주시면 확인이 쉬울 것 같아요~

  15. Blog Icon
    ww

    질문있습니다! 일반적인 프래그먼트 같은경우
    getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new Fragment()).commit(); 를 사용해서 버튼이라던지 전환을 할 수 있는데
    리스트 프래그먼트같은 경우는 어떤것을 사용해야할까요?

  16. 리스트 프래그먼트라고 해서 다른 것은 없습니다. 프래그먼트를 전환하기 위해 호출하는 replace() 함수를 보면, 컨테이너 id와 프래그먼트에 대한 참조가 들어가죠.
    그 프래그먼트 참조에 리스트 프래그먼트 만든 것을 지정하면 되는 것입니다.

    리스트 프래그먼트라고 뭔가 특별하게 더 해줘야 할 것이 있거나 그런 것은 아니라는 것이죠.

    넘 어렵게 생각하지 마세요. ^^

  17. Blog Icon
    ww

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context="org.androidtown.tablist.MainActivity"
    tools:showIn="@layout/activity_main">

    <ListView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/homeFragment"
    android:name="org.androidtown.tablist.MAinActivity"
    tools:layout="@layout/activity_main">


    </ListView>
    </RelativeLayout>

    이렇게 입력했는데

    Error:error: attribute 'org.androidtown.tablist:layout_behavior' not found.
    Error:attribute 'org.androidtown.tablist:layout_behavior' not found.
    Error:failed linking file resources.
    Error:java.util.concurrent.ExecutionException: java.util.concurrent.ExecutionException: com.android.tools.aapt2.Aapt2Exception: AAPT2 error: check logs for details
    Error:java.util.concurrent.ExecutionException: com.android.tools.aapt2.Aapt2Exception: AAPT2 error: check logs for details
    Error:com.android.tools.aapt2.Aapt2Exception: AAPT2 error: check logs for details
    Error:Execution failed for task ':app:processDebugResources'.
    > Failed to execute aapt

    이렇게 뜨는데 어떡해야하는거죠.?

  18. 본문의 예제는 프로젝트 생성 시, 액티비티 선택 단계에서 "Basic Activity"를 선택하였습니다.
    그런데 아마도 "ww"님께서는 "Empty Activity"를 선택하신 것 같네요. 본문의 레이아웃 XML 소스를 "Empty Activity" 선택 프로젝트에 그대로 붙여넣으면, 질문글에 올리신 에러를 만날 수 있습니다.

    해결방법은 그리 어렵지 않습니다. (http://recipes4dev.tistory.com/97 "No resource identifier found for attribute 'layout_behavior' in package")의 내용을 참고해보세요. 그럼 원인과 해결방법을 쉽게 찾으실 수 있을 것입니다.

    감사합니다.

  19. Blog Icon
    ww

    감사합니다!
    제가 탭레이아웃이 상단에 있으면서 그 밑에 리스트뷰 (예를들어 카톡 처럼 )
    이런 화면을 구현하고 싶은데 어떻게 해야 할까요??

  20. 음, 말씀하신 내용대로 구현하시면 될 것 같은데요?
    화면에 탭호스트를 배치하고, 탭 페이지에 대한 컨텐츠로 리스트뷰를 배치하면 될 것 같습니다. 그리 어려운 작업은 아닐 듯 하네요.

    블로그의 내용을 참고하시려면, (http://recipes4dev.tistory.com/115 "안드로이드 탭 기본 사용법")의 내용을 참고하시면 됩니다.

    작업하다가 궁금한 내용이 있으시면 다시 질문글 남겨주세요.

    감사합니다.

  21. Blog Icon
    ww

    11-23 21:18:25.293 25319-25319/? E/AndroidRuntime: FATAL EXCEPTION: main
    Process: org.androidtown.tablist, PID: 25319
    java.lang.RuntimeException: Unable to start activity ComponentInfo{org.androidtown.tablist/org.androidtown.tablist.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v4.app.ListFragment.setListAdapter(android.widget.ListAdapter)' on a null object reference
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2726)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2787)
    at android.app.ActivityThread.-wrap12(ActivityThread.java)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1504)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:154)
    at android.app.ActivityThread.main(ActivityThread.java:6247)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:872)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:762)
    Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v4.app.ListFragment.setListAdapter(android.widget.ListAdapter)' on a null object reference
    at org.androidtown.tablist.MainActivity.onCreate(MainActivity.java:19)
    at android.app.Activity.performCreate(Activity.java:6754)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2679)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2787) 
    at android.app.ActivityThread.-wrap12(ActivityThread.java) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1504) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:154) 
    at android.app.ActivityThread.main(ActivityThread.java:6247) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:872) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:762) 

    저렇게 실행한 결과 이런 에러가 ㅠㅠㅠ... 혼자해보려는데 이런것들은 기본이라 생각하고 하는데도 계속 막혀버리니 정말 힘드네요....

  22. 에러 메시지의 내용 중 가장 중요한 메시지는 아래의 내용이네요.

    Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v4.app.ListFragment.setListAdapter(android.widget.ListAdapter)' on a null object reference

    작성하신 소스 코드의 내용을 보지 못해서 정확히 판단할 순 없지만, 아마ListFragment를 넣고, setListAdapter() 함수를 호출할 때, ListFragment의 참조를 획득하지 않은 상태로 실행한 것 같습니다.

    관련 코드를 잘 보시면 쉽게 에러를 찾을 수 있을 듯 합니다.
    물론, 이미 에러를 찾으셨지만~ ^^

    감사합니다.

  23. Blog Icon
    ww

    와 해결 했습니다 !!!!!!!!!!!!!!!!!!!!!!!! 감사합니다 !!!
    상단에 ListFragment Example 1 이란 바를 탭바로 바꿔서
    4개의 메뉴를 넣고 (아이콘으로 넣고싶어요..) 탭 메뉴 밑에
    그리드뷰,리스트뷰를 넣고 싶은데 어떻게해야하죠..ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ

  24. 제가 도움을 드린 것은 없는데, 이미 해결하셨네요.

    만드려고 하는 내용이 어떤 건지 정확히 모르겠지만, 탭 밑에 리스트뷰를 두는 것이라면, 굳이 ListFragment를 사용할 필요가 있나... 하는 생각이 드네요.

    말 그대로, 탭호스트 안에 각 탭페이지의 컨텐츠로 리스트뷰 또는 를 배치하면 될 듯 합니다.

    탭 버튼에 이미지를 넣는 방법은 그리 어렵지 않으니, 찾아보면 쉽게 찾을 수 있을테구요.

    먼저 탭호스트, 탭위젯, 프레임레이아웃 으로 탭 화면을 구성하는 방법을 찾아보시면 원하는 화면을 만들 수 있을 것 같습니다.

    하나씩 차근차근 만들어보세요~ ^^
    너무 복잡하게 생각하지 마시고, 간단하게..

    조금 원론적인 답변밖에 드릴 수 없음을 양해바랍니다.

    감사합니다.

  25. Blog Icon
    문코치

    안녕하세요 질문 드릴게 있습니다.
    요즘 제가 코딩 하고 있는 내용이 내 스마트폰의 카메라 앨범에서 이미지를 선택하여
    프레그먼트에 있는 이미지뷰에 하나씩 띄워주고 싶은 상태 입니다.
    프레그먼트 마다 이미지뷰를 놔서 각각 다른 이미지를 선택, 띄워 저장하고 싶습니다.
    코드에 프레그먼트1 이미지뷰를 셋트 해놓으면 거기에 이미지가 띄워지는데 각각은 어떻게 할지..
    어렵네요ㅜ 어떻게 검색해야 소스를 찾을 수 있을지도 감이 안잡히고, 생각 하고 있는 기능은
    각기 다른 프레그먼트 화면에서 카메라앨범 버튼을 눌러서 이미지를 선택하면 그 프레그먼트에 이미지가 띄워지고
    다른 또 프레그먼트 에서 같은 방식으로 다른 각각 다른 이미지를 띄우는, 기능을 구현하고 싶어요
    어떻게 해야 될까요~?

  26. 질문하신 내용에서, 크게 어려운 점은 없어보입니다.

    1. 프래그먼트에 이미지뷰를 띄우고 이미지를 선택하여 표시하는 기능을 구현.

    2. 이러한 기능이 구현된 프래그먼트를 여러 개 생성.

    음.. 전혀 어려워하실 내용이 없어요.
    그냥 만들면 됩니다.

    1. 프래그먼트를 생성한다.
    2. 이미지뷰를 프래그먼트에 추가한다.
    3. 카메라 앨범 버튼을 추가한다.
    4. 이미지 선택 기능을 추가한다.
    5. 선택된 이미지를 이미지뷰에 표시한다.
    6. 프래그먼트를 여러 개 만든다.

    위 숫자 중에서 어려운 부분이 뭐가 있을까요?

    고민해보시고, 코딩해보시고, 확인해보시고,
    궁금한 내용 있으시면 다시 질문글 남겨주세요.

    감사합니다.