Activity ↔ Fragment 접근하기

Posted by ITPangPang
2016. 11. 26. 21:09 안드로이드(android)/Fragment



Activity ↔ Fragment

접근하기


ㆍ 이번글에서는 Activity에서 Fragment에 접근하는 방법


ㆍ Fragment에서 Activity에 접근하는 방법에 대해

    알아보도록 하겠습니다.




예전에 Fragment에서

Activity에 접근하는 방법은

잠깐 봤었는데,


이번에 한번 더 실험해보도록

하겠습니다.


아 참고로 이 글은

backStack을 남기면서

통신하고 그런 부분은 아니고


그냥 단순히 접근하는

내용입니다.


fragment에서 Activity에

있는 메서드나 변수에 접근한다던가.


Activity에서 Fragment에 있는

변수나 메서드에 접근하거나


일단 바로 테스트 화면을 만들어보겠습니다




먼저 위에처럼

화면을 만들어보겠습니다.


weight를 1씩 부여해서

화면의 반반씩 사용해보겠습니다.


상단에는 Activity 부분

하단에는 Fragment 부분입니다.


좀 더 정확히 말하면 Fragment는

Activity위에 Fragment가 올려져있는

상태겠죠



그리고 이제

아래 Fragment의

버튼을 누르면


Activity 영역에 있는

TextView의 글씨를

변경해보고


Activity의

버튼을 누르면


Fragment 영역에 있는

TextView의 글씨를

변경해보도록 하겠습니다



아주 간단하죠?


간단한만큼 접근하는

방법도 쉽습니다.


일단 방법을 알려드리기전에

전체코드를 먼저 올려보겠습니다.


[activity_main.xml]

<?xml version="1.0" encoding="utf-8"?>
<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"
tools:context="com.tistory.itpangpang.fragmentex.MainActivity">


<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1"
android:orientation="vertical"
android:gravity="center">
<TextView
android:id="@+id/tv_activity"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#000000"
android:text="여기는 Activity"
android:layout_gravity="center"
android:textSize="30dp"/>

<Button
android:id="@+id/btn_activity"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="Fragment의 TextView 변경"/>
</LinearLayout>

<LinearLayout
android:id="@+id/ll_fragment"
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1"
android:orientation="vertical"
android:background="#000000">
</LinearLayout>

</LinearLayout>


[fragment_main.xml]

<?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"
android:gravity="center"
android:background="#000000">

<TextView
android:id="@+id/tv_fragment"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Fragment 영역"
android:textColor="#FFFFFF"
android:textSize="30dp"
/>
<Button
android:id="@+id/btn_fragment"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Activity의 TextView에 접근"
android:textColor="#000000"
/>
</LinearLayout>



[MainActivity.java]

import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity
{
LinearLayout ll_fragment;
TextView tv_activity;
Button btn_activity;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ll_fragment = (LinearLayout)findViewById(R.id.ll_fragment);
tv_activity = (TextView)findViewById(R.id.tv_activity);
btn_activity = (Button)findViewById(R.id.btn_activity);


btn_activity.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
MainFragment mainFragment = (MainFragment) getFragmentManager().findFragmentById(R.id.ll_fragment);
mainFragment.changeFragmentTextView("호호호");

}
});
replaceFragment();
}

public void replaceFragment()
{
MainFragment mainFragment = new MainFragment();
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.ll_fragment, mainFragment);
fragmentTransaction.commit();
}

public void changeText(String text)
{
tv_activity.setText(text);
}
}


[MainFragment.java]

public class MainFragment extends Fragment
{
TextView tv_fragment;
Button btn_fragment;
public MainFragment()
{
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
View view = inflater.inflate(R.layout.fragment_main, container, false);
tv_fragment = (TextView)view.findViewById(R.id.tv_fragment);
btn_fragment = (Button)view.findViewById(R.id.btn_fragment);

btn_fragment.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
((MainActivity)getActivity()).changeText("하하하");
}
});
return view;
}

public void changeFragmentTextView(String text)
{
tv_fragment.setText(text);
}
}



Fragment에서 Activity 접근


이 부분은 검색하면

바로 나오는 부분이기도 하고


예전에 따로 이와 관련된

글을 살짝 썼던 기억이 있습니다.


접근하는 방법

Fragment에서


((MainActivity)getActivity).변수

((MainActivity)getActivity).메서드


위 코드를 보면

Fragment에서 버튼을 눌렀을때

Activity에 존재하는 메서드에

접근을 하였습니다.

        btn_fragment.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
((MainActivity)getActivity()).changeText("하하하");
}
});


Activity의 changeText라는

메서드에 "하하하"라는 String을

넘겨주었습니다.


Activity의 changeText 메서드를 보면

 public void changeText(String text)
{
tv_activity.setText(text);
}


Fragment에서 넘어온 String값을

받아서 Activity에 있는 TextView에

setText값으로 넣어주는 것을

확인 할 수 있습니다.



Activity에서 Fragment 접근


이 부분은

위에 있는 Fragment에서 Activity접근하기

보다는 덜 사용해서 그런지..


모르시는 분들이 은근히 많습니다.


제가 만들고 있는 앱에서도

이 부분을 사용하기는 하는데

특수한 상황에서 사용하고 있습니다.

(설명하기에는 너무 애매한 경우라 또. ㅎㅎ)


코드를 보면

        btn_activity.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
MainFragment mainFragment = (MainFragment) getFragmentManager().findFragmentById(R.id.ll_fragment);
mainFragment.changeFragmentTextView("호호호");

}
});


1줄 더 늘었지만

역시 어렵지는 않습니다.


첫번째 줄이 그나마

생소한 코드일 수 있습니다.

MainFragment mainFragment = (MainFragment) getFragmentManager().findFragmentById(R.id.ll_fragment);


이 부분인데 아마

findFragmentById의 id가

어떤건지 헷갈릴수도 있습니다.


이 id는

Fragment 교체할때의

Layout영역입니다.

    public void replaceFragment()
{
MainFragment mainFragment = new MainFragment();
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.ll_fragment, mainFragment);
fragmentTransaction.commit();
}

이 부분이 되겠습니다!


끝!..

'안드로이드(android) > Fragment' 카테고리의 다른 글

이것이 바로 Fragment 2편  (4) 2016.04.17
이것이 바로 Fragment  (0) 2016.04.16
Fragment란  (0) 2016.04.04