Fragment간 데이터 주고받기 (Interface 사용)
ViewModel을 이용하여 Fragment간 데이터를 주고받는 예제에 이어 이번에는 Interface를 이용하여 Fragment간 데이터를 주고 받는 방법에 대해서 알아보도록 하겠습니다.
지난번과 마찬가지로 Fragment간 데이터를 주고 받을때 주의점은 Fragment간 데이터를 직접 주고 받지 말고 Activity를 통해서 데이터를 주고 받아야 된다는 점입니다.
이번 예제도 ViewModel을 이용한 예제와 동일하게 ChattingFragment의 채팅창 데이터를 MonitoringFragment에 실시간 전달되도록 하는 예제를 만들어 보도록 하겠습니다.
[참고] Fragment간 데이터 주고받기 ( ViewModel 사용)
https://kadosholy.tistory.com/20
예제) ChattingFragment의 채팅창 데이터를 MonitoringFragment로 실시간 전달하기 (Interface 사용)
예제는 ChattingFragment의 채팅창 입력내용이 Activity를 통해 MonitoringFragment로 전달되어 MonitoringFragment 채팅창에 실시간 반영되도록 하는 예제입니다.
1. Interface 정의
프래그먼트간 통신에 사용될 interface를 정의해 줍니다.
- FragmentListener.java
public interface FragmentListener {
public void onCommand(int index, String message);
}
2. ChattingFragment
onAttach()에서 context를 받아와 캐스팅후 interface 구현 메소드(fragmentListener.onCommand(...))를 통해 MainActivity로 데이터 전달
- ChattingFragment.java
public class ChattingFragment extends Fragment {
private EditText chattingEditText;
private Button sendButton;
private TextView chattingTextView;
FragmentListener fragmentListener;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_chatting, container, false);
chattingEditText = rootView.findViewById(R.id.chatting_editText);
chattingTextView = rootView.findViewById(R.id.chatting_textView);
sendButton = rootView.findViewById(R.id.send_button);
sendButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String preMessage = chattingTextView.getText().toString();
chattingTextView.setText(chattingEditText.getText().toString() + "\n" + preMessage);
fragmentListener.onCommand(0, chattingEditText.getText().toString() + "\n" + preMessage);
chattingEditText.setText("");
}
});
return rootView;
}
@Override
public void onAttach(@NonNull Context context) {
super.onAttach(context);
if (context instanceof FragmentListener) {
fragmentListener = (FragmentListener) context;
}
}
@Override
public void onDetach() {
super.onDetach();
if (fragmentListener != null) {
fragmentListener = null;
}
}
}
- fragment_chatting.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"
tools:context=".ChattingFragment">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<EditText
android:id="@+id/chatting_editText"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"/>
<Button
android:id="@+id/send_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="전송"/>
</LinearLayout>
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/chatting_textView"
android:textSize="24dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</ScrollView>
</LinearLayout>
3. MonitoringFragment
MainActivity에서 사용할 public 메소드 구현 (displayMessage(String message) { ... })
- MonitoringFragment.java
public class MonitoringFragment extends Fragment {
private TextView monitoringTextView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_monitoring, container, false);
monitoringTextView = (TextView) rootView.findViewById(R.id.monitoring_textView);
return rootView;
}
public void displayMessage (String message) {
monitoringTextView.setText(message);
}
}
- fragment_monitoring.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"
tools:context=".ChattingFragment">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:textColor="#FFFFFF"
android:background="#000000"
android:text="Monitoring Fragment"
android:textSize="24dp" />
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/monitoring_textView"
android:textColor="@color/colorAccent"
android:textSize="24dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</ScrollView>
</LinearLayout>
4. MainActivity
FragmentListener interface 구현
- MainActivity.java
public class MainActivity extends AppCompatActivity implements FragmentListener{
private ChattingFragment chattingFragment;
private MonitoringFragment monitoringFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
chattingFragment = (ChattingFragment) getSupportFragmentManager().findFragmentById(R.id.fragment_chatting);
monitoringFragment = (MonitoringFragment) getSupportFragmentManager().findFragmentById(R.id.fragment_monitoring);
}
@Override
public void onCommand(int index, String message) {
if (index == 0) {
monitoringFragment.displayMessage(message);
}
}
}
- activity_main.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"
tools:context=".MainActivity">
<fragment
android:id="@+id/fragment_chatting"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:name="com.kadosholy.fragment_communication.ChattingFragment"
tools:layout="@layout/fragment_chatting" />
<fragment
android:id="@+id/fragment_monitoring"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:name="com.kadosholy.fragment_communication.MonitoringFragment"
tools:layout="@layout/fragment_monitoring" />
</LinearLayout>
'IT 개발 > Android' 카테고리의 다른 글
[안드로이드] Bottom Navigation View (0) | 2021.06.24 |
---|---|
[안드로이드] ScalableLayout - 모든 해상도를 한번에 표현하기 (0) | 2021.02.06 |
[안드로이드] Volley 사용법 - 로또 번호 가져오기 (1) | 2020.05.31 |
[안드로이드] 데이터 저장하기 - SQLite Database사용법 (0) | 2020.05.19 |
[안드로이드] Fragment간 데이터 주고받기 (ViewModel 사용) (0) | 2020.05.12 |