프로그래밍/안드로이드

안드로이드 - 프래그먼트 인수 전달

가카리 2015. 9. 12. 16:50
반응형

 

프래그먼트도 메소드와 비슷하게 액티비티의 요구에 따라 조금씩 다르게 동작하기 위해 인수를 받아 들인다.

 

이때 프래그먼트의 인수 저장을 위해 아규먼트를 사용하며 다음 두 메소드로 아큐먼트를 설정하거나 얻는다.

 

    void setArguments(Bundle args)

    Bundle getArguments()

 

아규먼트는 프래그먼트 내부에 저장되는 Bundle 객체이며 주로 프래그먼트의 생성에 관련된 정보를 저장한다.

 

그래서 아규먼트는 액티비티에 프래그먼트를 부착하기 전에만 저장할 수 있다.

 

다음은 아규먼트를 사용하여 정수를 저장하는 예제이다.

 

 

activity_fragment_argument.xml

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

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

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical"

>

    <EditText

     android:id="@+id/startnum"

     android:inputType="number"

     android:layout_width="match_parent"

     android:layout_height="wrap_content"

     android:text="5"

     />

    <Button

     android:id = "@+id/btnadd"

     android:layout_width="wrap_content"

     android:layout_height="wrap_content"

     android:onClick="mOnClick"

     android:text="Add"

     />

    <FrameLayout

     android:id="@+id/frame"

     android:layout_width="wrap_content"

     android:layout_height="wrap_content"

     />

    

</LinearLayout>

 

counterfragment.xml

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

android:orientation="vertical"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:gravity="center_horizontal"

android:background="#ffff00"

>

 

<TextView

android:id="@+id/txtcounter"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:textColor="#ff0000"

android:textSize="40sp"

android:text="0"

/>

<Button

android:id="@+id/btnincrease"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="Increase"

/>

 

</LinearLayout>

 

 

FragmentArgument.java

package com.example.ch20_fragmentargument;

 

import android.app.Activity;

import android.app.Fragment;

import android.app.FragmentManager;

import android.app.FragmentTransaction;

import android.os.Bundle;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.widget.Button;

import android.widget.EditText;

import android.widget.TextView;

 

 

public class FragmentArgument extends Activity {

    

    EditText mStartNum;

    

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_fragment_argument);

      

        mStartNum = (EditText)findViewById(R.id.startnum);

    }

    

    public void mOnClick(View v){

        switch(v.getId()){

        case R.id.btnadd:

            FragmentManager fm = getFragmentManager();

            //트랜잭션 시작

            FragmentTransaction tr = fm.beginTransaction();

            int start = Integer.parseInt(mStartNum.getText().toString());

            CounterFragment cf = CounterFragment.newInstance(start);//새로운 인스턴스 가져옴

            tr.add(R.id.frame, cf, "counter");

            tr.commit();

            break;

        }

    }

 

    public static class CounterFragment extends Fragment{

        //인스턴스 만들고 아규먼트에 값을 넣어두는 메소드

        public static CounterFragment newInstance(int start){

            CounterFragment cf = new CounterFragment();

            

            Bundle args = new Bundle();

            args.putInt("start", start);

            cf.setArguments(args);

            return cf;

        }

        

        public View onCreateView(LayoutInflater inflater, ViewGroup container,

                Bundle savedInstanceState){

            View root = inflater.inflate(R.layout.counterfragment, container,

                    false);

            

            Button btnIncrease = (Button)root.findViewById(R.id.btnincrease);

            final TextView textCounter = (TextView)root.findViewById(R.id.btnincrease);

            

            int start = 0;

            Bundle args = getArguments();//여기서 아까 저장한 값을 가져옴

            if(args != null){//값이 있다면

                start = args.getInt("start");//start 태그의 값을 취함

            }

            textCounter.setText(Integer.toString(start));//버튼의 텍스트를 바꿈

            

            //버튼클릭 리스너 등록

            btnIncrease.setOnClickListener(new Button.OnClickListener(){

 

                @Override

                public void onClick(View v) {

                    int count = Integer.parseInt(textCounter.getText().toString());

                    textCounter.setText(Integer.toString(count + 1));

                }

                

            });

            return root;

        }

    }

}

 

 

실행 화면

에디트에 적당한 정수를 입력한 후 Add 버튼을 누르면 아래쪽의 빈 프레임에 프래그먼트를 추가하되 에디트에 입력한 시작값을 전달받아 동작한다.