Activity ↔ 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 |