'[Android] - 개념/Fragment'에 해당되는 글 4건

  1. 2016.12.04 Fragment 기초 예제 3
  2. 2016.12.04 Fragment 기초 예제 2 2
  3. 2016.11.30 Fragment 기초 예제 1
  4. 2016.11.29 Fragment 기본 개념

[ Fragment 기초 예제 3 ]                                    0. 참고 : DO IT 안드로이드 (02-10 : SampleFragment2)

 

1. Layout3개

   - activity_main.xml                    fragment_list.xml                    fragment_viewer.xml

     

2. 실행 화면

    

 

 

1. activity_main.xml

   - <fragment> 2개를 위/아래로 가지고 있음

   - android:name : Fragment를 넣을 객체명 지정

   -

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <fragment
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:name="org.androidtown.fragment.ListFragment"
        android:id="@+id/listFragment" />

    <fragment
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:name="org.androidtown.fragment.ViewerFragment"
        android:id="@+id/viewerFragment" />


</LinearLayout> 

 

2. fragment_list.xml

   -

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ListView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/listView" />
</LinearLayout>

 

3. fragment_viewer.xml

   -

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/imageView"
        android:src="@drawable/dream01"/>

</LinearLayout>

 

4. MainActivity.java

   - drawable 폴더 밑으로 dream01.png, dream02.png, dream03.png 이미지 3개 필요

   -

public class MainActivity extends AppCompatActivity implements ListFragment.ImageSelectionCallback {
    ListFragment listFragment;
    ViewerFragment viewerFragment;

    int[] images = {R.drawable.dream01, R.drawable.dream02, R.drawable.dream03};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        FragmentManager manager = getSupportFragmentManager();
        listFragment = (ListFragment) manager.findFragmentById(R.id.listFragment);
        viewerFragment = (ViewerFragment) manager.findFragmentById(R.id.viewerFragment);
    }

    @Override
    public void onImageSelected(int position) {
        viewerFragment.setImage(images[position]);
    }
}

 

5. ListFragment.java

   -

public class ListFragment extends Fragment {
    String[] values = {"첫번째 이미지", "두번째 이미지", "세번째 이미지"};

    public static interface ImageSelectionCallback {
        public void onImageSelected(int position);
    }

    public ImageSelectionCallback callback;

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);

        if (context instanceof ImageSelectionCallback) {
            callback = (ImageSelectionCallback) context;
        }
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment_list, container, false);

        ListView listView = (ListView) rootView.findViewById(R.id.listView);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(getContext(), android.R.layout.simple_list_item_1, values);
        listView.setAdapter(adapter);

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                if (callback != null) {
                    callback.onImageSelected(position);
                }
            }
        });

        return rootView;
    }
}

 

6. ViewerFragment.java

   -

public class ViewerFragment extends Fragment {
    ImageView imageView;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment_viewer, container, false);

        imageView = (ImageView) rootView.findViewById(R.id.imageView);

        return rootView;
    }

    public void setImage(int resId) {
        imageView.setImageResource(resId);
    }
}

 

'[Android] - 개념 > Fragment' 카테고리의 다른 글

Fragment 기초 예제 2  (2) 2016.12.04
Fragment 기초 예제 1  (0) 2016.11.30
Fragment 기본 개념  (0) 2016.11.29
Posted by 농부지기
,

[ Fragment 기초 예제 2 ]                                    0. 참고 : DO IT 안드로이드 (02-10 : SampleFragment)

 

1. 소스 이동 설명

   - activity_main.xml  -> fragment_main.xml <-> fragment_menu.xml

     실제 이동 방법은

        activity_main.xml  Layout에서  onFragmentChanged()  메소드를 이용해서 2개의 fragment를 교체(replace)해준다.

                  -> fragment_main.xml 

                  -> fragment_menu.xml

   - activity_main.xml 내부에 <fragment> 안에  fragment_main Layout을 넣는다.

   - fragment_main Layout에서 버튼을 클릭 하면 fragment_menu Layout을 open한다.

   - fragment_menu Layout 에서 [메인 화면 으로] 버튼 클릭 시    fragment_main Layout으로 간다.

   -

        <-> 

 

 

 

2. FragmentManage객체

   - 프래그먼트 매니저는 프래그먼트를 다루는 작업을 해주는 객체로써 프래그먼트를 추가,삭제 또는 교체등의 작업을 할 수 있게 해줌.

   - 그런데 이런 작업들은 프래그먼트를 변경할 때 오류가 생기면 다시 원래 상태로 돌릴 수 있어야 하므로 트랜젝션 객체를 만들어 실행한다.

   - 트랜젝션 객체는 beginTransaction()메소드를 호출하면 시작되고 commit()메소드를 호출하면 실행된다.

 

3. getFragmentManager(), getSupportFragmentManager() 의 동일점, 차이점

   - 동일점 : 동일한 기능을 수행하는 FragmentManager객체를 리턴

   - 차이점 : getSupportFragmentManager()메소드는 안드로이드 이전 버전들에서도 프래그먼트를 사용할 수 있도록 만든

                appcompat_v7라이브러리 프로젝트에서 지원하는 기능이므로 프로젝트를 만들 때 getSupportFragmentManager()메소드

                사용을 권장 한다.

                이는 MainActivity객체가 상속하는 AppCompatActivity클래스도 마찬가지여서 android.support.v7.app패키지 안에 있는

                AppCompatActivity클래스를 사용해야 한다.

 

 

 

1. activity_main.xml

   - <fragment> 가 필요 : 첫 activity_main Layout을 띄우면서 바로  fragment_main Layout을 이 <fragment>에 넣는다.

   - android:name="org.androidtown.fragment.MainFragment" :

   -

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/container"
    >

    <fragment
        android:id="@+id/mainFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:name="org.androidtown.fragment.MainFragment" />

</RelativeLayout>

 

2. MainActivity.java

   1. getSupportFragmentManager().findFragmentById()

      - Fragment는 뷰가 아니라서 Activity클래스에 있는 findViewById()메소드를 이용해서 찾을 수 없다.

         대신 프래그먼트르르 관리하는 FragmentManager객체의 findFragmentById()메소드를 이용해 찾을 수 있다.

      - 메인 프래그먼트는 findFragmentById() 메소드를 이용해 찾은 후 변수에 할당하고,

        메뉴 프래그먼트는 new연산자를 이용해 새로운 객체로 만든 후 변수에 할당한다.

   2. onFragmentChanged()
      - MainFragment.java에서 호출
      - activity_main Layout에서  2개의 Fragment를 교체 해준다.

   3. getSupportFragmentManager()

      - 메인 액티비티에 새로 추가할 메소드로 프래그먼트 매니저를 이용해 프래그먼트를 전환하는 메소드이다.

        이렇게 코드를 입력한 이유는 프래그먼트가 액티비티를 본더 만들었고 액티비티 관리를 시스템에서 하는 것처럼

        프래그먼트 관리를 액티비티가 하기 때문이며, 액티비티에서 프래그먼트를 전환하도록 만들어야 하기 때문이다.

public class MainActivity extends AppCompatActivity {
    MainFragment mainFragment;
    MenuFragment menuFragment;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mainFragment = (MainFragment) getSupportFragmentManager().findFragmentById(R.id.mainFragment);
        menuFragment = new MenuFragment();
    }

    public void onFragmentChanged(int index) {
        if (index == 0) {
            getSupportFragmentManager().beginTransaction().replace(R.id.container, menuFragment).commit();
        } else if (index == 1) {
            getSupportFragmentManager().beginTransaction().replace(R.id.container, mainFragment).commit();
        }
    }
}

 

3. MainFragment.java

   -

public class MainFragment extends Fragment {

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment_main, container, false);

        Button button = (Button) rootView.findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                MainActivity activity = (MainActivity) getActivity();
                activity.onFragmentChanged(0);
            }
        });

        return rootView;
    }
}

 

4. MenuFragment.java

   -

public class MenuFragment extends Fragment {

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment_menu, container, false);

        Button button = (Button)rootView.findViewById(R.id.button);
        button.setOnClickListener(buttonListener);

        return rootView;
    }

    View.OnClickListener buttonListener = new View.OnClickListener(){
        @Override
        public void onClick(View v) {
            Toast.makeText(getContext(), "메인 화면으로 가기 버튼 클릭", Toast.LENGTH_SHORT).show();
            //종료 안됨.
            //  --아래 2줄은 Fragment를 change해주는 소스임
            //  --MainActivity에 Fragment를 여러장 올려 놓고 서로 교체하는 소스임.
            //  --예url : http://blog.naver.com/ssy9137/220725822294
            //MainActivity activity = (MainActivity)getActivity();
            //activity.onFragmentChanged(-1);

            //getActivity().getFragmentManager().beginTransaction().remove(this).commit();  //this 오류 발생
            //getActivity().getSupportFragmentManager().beginTransaction().remove(this).commit();  //this 오류 발생
            //getActivity().getSupportFragmentManager().popBackStack();  //종료 안됨
            //getActivity().getFragmentManager().popBackStack();  //종료 안됨
            //getFragmentManager().popBackStack(); //종료 안됨
            //getActivity().onBackPressed();  //아에 앱이 종료 됨. 즉 Main Activity 로 돌아가지 않음.
            //getActivity().finish();  //아에 앱이 종료 됨. 즉 Main Activity 로 돌아가지 않음.

            //종료 안됨.
            //FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
            //transaction.addToBackStack(null);

            //종료 잘 됨.
            //  아래 방식은 fragment를 종료하는 방법임
            //FragmentManager manager = getActivity().getSupportFragmentManager();
            //manager.beginTransaction().remove(MenuFragment.this).commit();
            //manager.popBackStack();

            //MainActivity.java 의 replace문법으로 fragment를 교체해 준다.
            MainActivity activity = (MainActivity) getActivity();
            activity.onFragmentChanged(1);
        }
    };
}

 

5. fragment_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="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="메인 프래그먼트"
        android:id="@+id/textView"
        android:textSize="30dp" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="메뉴 화면으로"
        android:id="@+id/button" />
</LinearLayout>

 

6. framgnet_menu.xml

   -

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#ffc07c">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="메뉴 프래그먼트"
        android:id="@+id/textView"
        android:textSize="30dp" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="메인 화면으로"
        android:id="@+id/button" />
</LinearLayout>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'[Android] - 개념 > Fragment' 카테고리의 다른 글

Fragment 기초 예제 3  (0) 2016.12.04
Fragment 기초 예제 1  (0) 2016.11.30
Fragment 기본 개념  (0) 2016.11.29
Posted by 농부지기
,

참고 URL : http://itpangpang.tistory.com/114

 

 

 

 

public class MainActivity extends AppCompatActivity {

        Button btn_move_page1;
        Button btn_move_page2;
        Button btn_move_page3;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            setup();

            movePage1();
        }
        private void setup()
        {
            btn_move_page1 = (Button) findViewById(R.id.btn_move_page1);
            btn_move_page2 = (Button) findViewById(R.id.btn_move_page2);
            btn_move_page3 = (Button) findViewById(R.id.btn_move_page3);

            btn_move_page1.setOnClickListener(myListener);
            btn_move_page2.setOnClickListener(myListener);
            btn_move_page3.setOnClickListener(myListener);
        }

        View.OnClickListener myListener = new View.OnClickListener(){
            @Override
            public void onClick(View view) {
                btn_move_page1.setSelected(false);
                btn_move_page2.setSelected(false);
                btn_move_page3.setSelected(false);

                switch (view.getId()){
                    case R.id.btn_move_page1:
                        movePage1();
                        break;
                    case R.id.btn_move_page2:
                        movePage2();
                        break;
                    case R.id.btn_move_page3:
                        movePage3();
                        break;
                }
            }
        };



        public void movePage1(){
            Page1 page1 = new Page1();
            //FragmentManager : Activity위(안)에서 Fragment와 Activity의 상호작용을 관리
            FragmentManager fragmentManager = getFragmentManager();

            //FragmentTransaction
            //  - 실질적으로 이 Transaction이  Activity위에 Fragment를 올려주고(add) 있던걸 빼고
            //    다시올리고(replace)  제거해주고(remove)  commit등 여러가지 중요한  활동이 가능하게 도와준다.
            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
            fragmentTransaction.replace(R.id.ll_page, page1);
            fragmentTransaction.commit();
        }

        public void movePage2(){
            Page2 page2 = new Page2();
            FragmentManager fragmentManager = getFragmentManager();
            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
            fragmentTransaction.replace(R.id.ll_page, page2);
            fragmentTransaction.commit();
        }

        public void movePage3(){
            Page3 page3 = new Page3();
            FragmentManager fragmentManager = getFragmentManager();
            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
            fragmentTransaction.replace(R.id.ll_page, page3);
            fragmentTransaction.commit();
        }

        //버튼 하단에 있는 LinearLayout에 보여줄 페이지 처리
        // - 이때 Activity라면 AppCompatActivity 를 extends 받아야 된다.
        // - extends를 Fragment로 하면서 Activity가 아니라 Fragment임을 알 수 있다.
        //   또한 onCreate()메소드가 아닌 onCreateView()메소드를 이용했다.
        public static class Page1 extends Fragment {
            @Override
            public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
                //화면을 가져오기 위해서 LayoutInflater 객체를 이용했다.
                //  - inflate() : xml을 실제 객체로 사용가능하게 하는 역할을 담당
                View view = inflater.inflate(R.layout.fragment_page1, container, false);
                return view;
            }
        }
        public static class Page2 extends Fragment {
            @Override
            public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
                View view = inflater.inflate(R.layout.fragment_page2, container, false);
                return view;
            }
        }
        public static class Page3 extends Fragment {
            @Override
            public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
                View view = inflater.inflate(R.layout.fragment_page3, container, false);
                return view;
            }
        }

}

 

 

 

'[Android] - 개념 > Fragment' 카테고리의 다른 글

Fragment 기초 예제 3  (0) 2016.12.04
Fragment 기초 예제 2  (2) 2016.12.04
Fragment 기본 개념  (0) 2016.11.29
Posted by 농부지기
,

[ Fragment ]

 

1. 기본 개념

   1. Fragment도 Activity처럼 생명주기가 있지만 Activity위에서 동작하기 때문에 Activity가 종료되면 모든 Fragment도 종료된다.

   2. Fragment는 app.Fragment와 support.v4.app.Fragment library 가 존재

   3. 화면(Activity)를 여러 조각으로 나누워도  관리 및 조회하고 싶을때 Fragment를 사용.

   4. Fragment는 항상 Activity위에 올라가 있어야 한다.

   5. [탭]버튼을 클릭시 다른 화면을 보여줄때 Activity도 가능 하지만 Fragment를 사용하면 더 좋다.

 

   9. 하나의 액티비티 위에 여러 개의 액티비티를 올릴수 있다.

       - 구체적으로 Activity클래스와 AcitivityGroup클래스를 이요하면 구현 가능

       - 하지만 하나의 화면을 독립적으로 구성할 때 필요한 여러 가지 속성들을 사용하면, 안드로이드 시스템에서 관리하는

         애플리케이션 구성 요소이므로 액티비티 안에 다른 액티비티를 넣는 것은 단말의 리소스를 많이 사용하는 비효율적인 방법이 된다.

 

2. Fragment 주요 메소드

   - public final Activity getActivity()

         : 이 프래그먼트를 포함하는 액티비티를 리턴함.

   - public final FragmentManager getFragmentManager()

         : 이 프래그먼트를 포함하는 액티비티에서 프래그먼트 객체들과 의사소통하는 프래그먼트 매니저를 리턴함.  

   - public final Fragment getParentFragment()

         : 이 프래그먼트를 포함하는 부모가 프래그먼트일 경우 리턴함. 액티비티이면 null을 리턴함.

   - public final int getId()

         : 이 프래그먼트의 ID를 리턴함.

 

3. FragmentManager 주요 메소드

   - public abstract FramgentTransaction beginTransaction()

          : 프래그먼트를 변경하기 위한 트랜젝션을 시작함

   - public abstract Framgent  findFragmentById(int id)

          : ID를 이용해 프래그먼트 객체를 찾음

   - public abstract Framgent  findFragmentByTag(String tag)

          : 태그 정보를 이용해 프래그먼트 객체를 찾음

   - public abstract boolean executePendingTransaction()

          : 트랜젝션은 commit()메소드를 호출하면 실행되지만 비동기(asynchronous)방식으로 실행되므로 즉시 실행하고 싶다면 이 메소드를 추가로 호출해야 됨

 

URL : http://itpangpang.tistory.com/''

'[Android] - 개념 > Fragment' 카테고리의 다른 글

Fragment 기초 예제 3  (0) 2016.12.04
Fragment 기초 예제 2  (2) 2016.12.04
Fragment 기초 예제 1  (0) 2016.11.30
Posted by 농부지기
,