티스토리 뷰

반응형

Stack Overflow에 자주 검색, 등록되는 문제들과 제가 개발 중 찾아 본 문제들 중에서 나중에도 찾아 볼 것 같은 문제들을 정리하고 있습니다.

Stack Overflow에서 가장 먼저 확인하게 되는 가장 높은 점수를 받은 Solution과 현 시점에 도움이 될 수 있는 가장 최근에 업데이트(최소 점수 확보)된 Solution을 각각 정리하였습니다.

 

아래 word cloud를 통해 이번 포스팅의 주요 키워드를 미리 확인하세요.

Passing data between a fragment and its container activity

프래그먼트와 그것을 포함하는 액티비티 간에 데이터를 전달하는 방법

 문제 내용 

How can I pass data between a fragment and its container activity? Is there something similar to passing data between activities through intents?

프래그먼트와 그것을 포함하는 액티비티 간에 데이터를 전달하는 방법은 무엇인가요? 인텐트를 통해 액티비티 간에 데이터를 전달하는 것과 유사한 방법이 있나요?

 

I read this, but it didn't help much:
http://developer.android.com/guide/topics/fundamentals/fragments.html#CommunicatingWithActivity

다음을 읽어보았으나 도움이 되지 않았습니다:
http://developer.android.com/guide/topics/fundamentals/fragments.html#CommunicatingWithActivity

 

 

 

 높은 점수를 받은 Solution 

Try using interfaces.

인터페이스를 사용해보세요.

 

Any fragment that should pass data back to its containing activity should declare an interface to handle and pass the data. Then make sure your containing activity implements those interfaces. For example:

데이터를 그것을 포함하는 액티비티로 전달해야 하는 모든 프래그먼트는 데이터를 처리하고 전달하기 위한 인터페이스를 선언해야 합니다. 그런 다음 포함하는 액티비티가 이러한 인터페이스를 구현하도록 하십시오. 예를 들어:

 

JAVA

In your fragment, declare the interface...

프래그먼트에서 인터페이스를 선언하세요.
public interface OnDataPass {
    public void onDataPass(String data);
}

 

Then, connect the containing class' implementation of the interface to the fragment in the onAttach method, like so:

그런 다음, onAttach 메서드에서 포함하는 클래스의 인터페이스 구현을 프래그먼트에 연결하십시오.
OnDataPass dataPasser;

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    dataPasser = (OnDataPass) context;
}

 

Within your fragment, when you need to handle the passing of data, just call it on the dataPasser object:

프래그먼트 내에서 데이터를 전달해야 할 때는 dataPasser  객체를 통해 호출하면 됩니다
public void passData(String data) {
    dataPasser.onDataPass(data);
}

 

Finally, in your containing activity which implements OnDataPass...

마지막으로, OnDataPass를 구현하는 포함 액티비티에서...
@Override
public void onDataPass(String data) {
    Log.d("LOG","hello " + data);
}

KOTLIN

 

Step 1. Create Interface

1단계. 인터페이스 생성
interface OnDataPass {
    fun onDataPass(data: String)
}

 

Step 2. Then, connect the containing class' implementation of the interface to the fragment in the onAttach method (YourFragment), like so:

2단계. 그런 다음, onAttach 메서드에서 포함하는 클래스의 인터페이스 구현을 프래그먼트에 연결하십시오.
lateinit var dataPasser: OnDataPass

override fun onAttach(context: Context) {
    super.onAttach(context)
    dataPasser = context as OnDataPass
}

 

Step 3. Within your fragment, when you need to handle the passing of data, just call it on the dataPasser object:

3단계. 프래그먼트 내에서 데이터를 전달해야 할 때는 데이터 패서 객체를 통해 호출하면 됩니다.
fun passData(data: String){
    dataPasser.onDataPass(data)
}

 

Step 4. Finally, in your activity implements OnDataPass

4단계. 마지막으로, OnDataPass를 구현하는 액티비티
class MyActivity : AppCompatActivity(), OnDataPass {}

override fun onDataPass(data: String) {
    Log.d("LOG","hello " + data)
}

 

 

 가장 최근 달린 Solution 

Interface is one of the best solutions:

인터페이스는 가장 좋은 솔루션 중 하나입니다.

 

Glue Interface:

글루 인터페이스:
public interface DataProviderFromActivity {

    public String getName();
    public String getId);

}  

 

MyActivity:

public class MyActivity implements DataProviderFromActivity{

    String name = "Makarov";
    String id = "sys533";

    ... ... ... ... ... .... .... 
    ... ... ... ... ... .... .... 

    public String getName(){
        return name;
    };
    public String getId(){
        return id;
    };
}

 

MyFragment:

public class MyFragment extends Fragment{

    String fragName = "";
    String fragId = "";

    ... ... ... ... ... .... .... 
    ... ... ... ... ... .... .... 

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        DataProviderFromActivity myActivity= (DataProviderFromActivity) getActivity();
        fragName = myActivity.getName();
        fragId = myActivity.getId();

        ... ... ... ... ... .... .... 
        ... ... ... ... ... .... .... 

        updateFragmentView();
    }
}

 

 

출처 : https://stackoverflow.com/questions/9343241/passing-data-between-a-fragment-and-its-container-activity

반응형
댓글
공지사항
최근에 올라온 글