🟨 목 차 🟨
1. 프래그먼트에서 액티비티로의 데이터 전달
1-1. 프래그먼트에서 액티비티로의 데이터 전달 어려운 이유
1-2. 인터페이스를 통해 프래그먼트에서 액티비티로 전달 방법
◼️ 1. 프래그먼트에서 액티비티로의 데이터 전달 ◼️
구글 지도 API를 쓰고 이것을 응용하여 현재 위치까지 받아 올 수 있는 기능을 만들어 보았다. 현재 위치까지는 보여주는 예제들이 많지만 이렇게 보여주는 값들을 내가 원하는 데이터(도시 이름만의 데이터)를 가공하고 이것을 다른 레이아웃(액티비티나 or Fragment)로 전달해주는 것까지 해보았다.
그 과정에서 구글 지도 API를 적용시키는 것까진 쉬웠고, 이것을 내가 원하는 데이터 형태로 만드는것까지 시간이 걸리긴 했지만 완성을 하였다. 내가원하는 데이터 형태로 만들었으니 이것을 다른 레이아웃(액티비티나 or Fragment)로 전달 할 수 있었느나, 이 부분에서 많은 오류가 발생하고 잘 되지 않았다. 왜냐하면
◼️ 1-1. 프래그먼트에서 액티비티로의 데이터 전달 어려운 이유
- 첫번째, 나는 화면 전환을 하지 않으며 데이터만 전달을 해야한다 -->가장 쉬운 인텐트 사용이 불가하다.
- 두번째, 나의 상황의 경우 Fragment 에서 액티비티로 데이터 전달을 하는 것이기 때문이다. --> 프래그먼트간의 데이터 전달인 Bundle 을 사용할 수 없다.
- 세번째, Fragment 에서 액티비티로 데이터 전달의 글이 별로 없었고, 그 글들을 다 따라 해봤는데 오류가 발생하였고, 이 오류의 원인을 파악하는데 너무 오래걸렸다.
◼️ 1-2. 인터페이스를 통해 프래그먼트에서 액티비티로 전달 방법
인터페이스는 클래스와는 다르게 메서드를 만들거나 기능을 구현하지 않는다.
인터페이스를 사용하는 쪽에서 직접 원하는 기능을 구현해야한다.
즉, 프래그먼트에서 기능을 구현해서 데이터를 보내고 액티비티에서 데이터를 받는다.
<SendEventListener.java>
package com.example.shopproject;
public interface SendEventListener {
public void sendmail(String s);
}
위의 코드는 인터페이스를 구현한 코드이다.( New-Java Class-Interface 생성)
<Fragment2_near.java>
SendEventListener sendEventListener; //인터페이스 변수 생성
@Override
public void onAttach(@NonNull Context context) { // Fragment에서 Activity로 값을 전달하기 위한 함수
super.onAttach(context);
try{
sendEventListener = (SendEventListener) context;
}catch (ClassCastException e) {
throw new ClassCastException(context.toString()+"must implements SendEventlistener");
// 예외를 강제로 발생시킨 후, 상위 블럭이나 catch문으로 예외를 던진다.
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
sendEventListener.sendmail(current); // 인터페이스를 이용하여 현재 구글 맵을 보여주는 Fragment 에서 current(현재 지역 위치 값)을 activity로 전달한다.
View view = inflater.inflate(R.layout.fragment2_near, container, false);
return view;
}
위의 코드는 프래그먼트 이고 보낼 데이터를 인터페이스의 메소드를 통해 넣는다.
<Main_Activity.java>
public class Main_Activity extends AppCompatActivity implements SendEventListener {
static String loc;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity);
bottomNavigationView = findViewById(R.id.bottomNavi); //만들었던 main_activity의 bottomNavi 연결하기
//처음화면 설정
getSupportFragmentManager().beginTransaction().add(R.id.main_frame,new Fragment1_home()).commit();
//바텀 네비게이션 뷰 안의 아이템 설정(각 아이템 클릭 이벤트)
bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
//각 item 클릭시 id값을 가져와 replace()를 이용해 FrameLayout에 각 Fragemnt.xml띄위기
case R.id.item_fragment1:
getSupportFragmentManager().beginTransaction().replace(R.id.main_frame, new Fragment1_home()).commit();
break;
case R.id.item_fragment2:
getSupportFragmentManager().beginTransaction().replace(R.id.main_frame, new Fragment2_near()).commit();
break;
case R.id.item_fragment3:
getSupportFragmentManager().beginTransaction().replace(R.id.main_frame, new Fragment3_chat()).commit();
break;
case R.id.item_fragment4:
getSupportFragmentManager().beginTransaction().replace(R.id.main_frame, new Fragment4_me()).commit();
break;
}
return true;
}
});
}
@Override
public void sendmail(String s) {
loc = s;
}
위의 코드는 프래그먼트에서 보낸 데이터를 이용할 액티비티 이다. 사용하는 방법은 implements SendEventListener를 통해 인터페이스를 상속받고 인터페이스의 메소드를 오버라이드를 한다. 메소드를 오버라이드를 하여 데이터를 받아온다. 나는 여기서 static(전역변수)를 이용하였다.[원래는 DB를 이용하여 사용자의 위치 정보에 값을 저장하고 거기서 내보내야 하지만 파이어베이스를 이용하는 나는 인터페이스를 이용한 데이터 전달로 해결하였다.]
'프로젝트 > Android Studio_중고거래앱_Project' 카테고리의 다른 글
Android Studio_중고거래 앱(SharedPreferences를 이용한 로그인 정보 저장 구현(자동 로그인) ) (0) | 2022.08.05 |
---|---|
Android Studio_중고거래 앱(파이어베이스를 이용한 로그아웃, 회원탈퇴) (0) | 2022.08.05 |
Android Studio_중고거래 앱(구글 Map Api 사용을 하여 현재 위치 추출하기) (0) | 2022.08.04 |
Android Studio_중고거래 앱(등록된 상품 목록을 클릭하면 자세한 상품 내용 보여주는 화면 구성) (0) | 2022.08.04 |
Android Studio_중고거래 앱(상품 등록, 상품 등록 후 상품 목록들) (2) | 2022.08.02 |