반응형

 

Fragment간 데이터 주고받기 (Interface 사용)

 

 

 

ViewModel을 이용하여 Fragment간 데이터를 주고받는 예제에 이어 이번에는 Interface를 이용하여 Fragment간 데이터를 주고 받는 방법에 대해서 알아보도록 하겠습니다. 

지난번과 마찬가지로 Fragment간 데이터를 주고 받을때 주의점은 Fragment간 데이터를 직접 주고 받지 말고 Activity를 통해서 데이터를 주고 받아야 된다는 점입니다. 

 

이번 예제도 ViewModel을 이용한 예제와 동일하게 ChattingFragment의 채팅창 데이터를 MonitoringFragment에 실시간 전달되도록 하는 예제를 만들어 보도록 하겠습니다. 

 

 

[참고] Fragment간 데이터 주고받기 ( ViewModel 사용)

 

https://kadosholy.tistory.com/20

 

[안드로이드] Fragment간 데이터 주고받기 (ViewModel 사용)

Fragment간 데이터 주고받기 (ViewModel 사용) 안드로이드 앱을 만들다 보면 Fragment를 이용하여 앱 구성을 하게 되고 이때 구성된 Fragment간에 데이터를 주고받을 일이 거의 필수적으로 생기게 됩니다.

kadosholy.tistory.com

 

 

 

예제) 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>

 

 

반응형

+ Recent posts