일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- flutter 회전
- 노티피케이션 익스텐션
- 안드로이드 에러
- flutter rotate
- 앱 백그라운드 푸시 데이터 저장
- Flutter UIKitView MethodChannel
- 스위프트 테이블 뷰 셀
- 안드로이드 앨범
- 스위프트 앨범
- swift sms
- Flutter NativeView
- native flutter view
- swift 문자
- 푸시 데이터 저장
- 안드로이드 FCM
- 스위프트 UserDefaults
- Swift flutterviewcontroller
- silent push
- 스위프트 카메라
- 스위프트 푸시
- 안드로이드 바로가기
- swift autolayout
- 플러터 뷰 컨트롤러
- 앱 꺼졌을 때 푸시 데이터 저장
- Swift flutterview
- FlutterView MethodChannel
- NotificationService Extension
- 스위프트
- 스위프트 웹뷰
- 안드로이드 숏컷
- Today
- Total
Things take time
[Android] Fragment Activity, 프래그먼트 액티비티란 본문
[액티비티]
흔히 액티비티는 하나의 화면을 의미한다. 그래서 하나의 액티비티 클래스는 하나의 XML로 된 레이아웃 파일과 연결된다.
그런데 프래그먼트 액티비티란 개념이 나왔는데, 이 액티비티는 간단히 말해서 하나의 액티비티안에 여러 개의 액티비티를 보여주고 싶다는 목적으로 사용한다. (실제로 액티비티를 여러개 넣는 것이 아니고 그렇게 보이도록 하는 것)
그러므로 로직은 하나의 액티비티가 존재하고, 그 액티비티 안에 다른 액티비티들을 넣고 싶다면 다른 액티비티들(넣는, 들어가는 액티비티)은 Fragment를 상속받는 액티비티여야 한다.
[액티비티 -> 프래그먼트 액티비티 변경]
프래그먼트 액티비티로 새로만들면 되지만, 기존 액티비티를 프래그먼트로 쓰고 싶을때 사용한다는 의미이다.
아래의 기본 액티비티 클래스를 만들었다(레이아웃 XML과 함께)
public class PartnersListActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_partners_list);
}
}
이걸 프래그먼트로 상속받도록 변경하면
- 참고
Fragment는 Activity의 한 종류에 속하는 개념이다. 또한, FragmentActivity라는 클래스를 상속받는 것과 헛갈릴 수 있지만, FragmentActivity를 상속받는 것은 옛날 안드로이드 3.0이전의 Fragment를 지원하기위해 상속받는 클래스이므로, 간단히 Fragment를 사용해야하며 이게 프래그먼트 액티비티란 것이다.
public class PartnersListActivity extends Fragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.activity_partners_list, container, false);
return view;
}
}
onCreateView라는 함수를 오버라이드하게 되며, 실제 레이아웃파일 위젯과 findViewById를 통해 연결하는하는 곳이 onCreateView이다. 참고로 onCreate는 onCreateView이전에 호출된다.
연결된 레이아웃파일은 이렇게 생겼다.
[프래그먼트를 호출하는 모체 액티비티]
프래그먼트 액티비티를 호출할 액티비티를 생성한다.
public class IncludeActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_include);
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(R.id.ll_fragment, new PartnersListActivity());
transaction.commit();
}
}
일반 액티비티를 상속받으며 activity_include라는 xml 레이아웃파일로 되어있다.
중요한 것은 그 다음부터 나오는 FragmentManger 클래스와 transaction이다.
ll_fragment라는 리니어 레이아웃 id를 찾아서 그 부분을 PartnersListActivity, 즉 프래그먼트를 상속받는 액티비티로 교체한다는 의미이다.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:layout_height="match_parent" android:layout_width="match_parent" android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android">
<TextView
android:layout_width="match_parent"
android:layout_height="100dp"
android:textSize="20dp"
android:gravity="center_horizontal|center_vertical"
android:textColor="@color/colorPrimary"
android:text="여기는 include activity"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:id="@+id/ll_fragment"
></LinearLayout>
</LinearLayout>
activity_include.xml
위 화면처럼 모체 액티비티를 생성했다.
include activity라는 텍스트뷰 밑에는 LinearLayout이 들어가 있다. 이제 이를 실행하면
activity_include.xml 안에 있던 리니어레이아웃에 프래그먼트 액티비티를 넣은 것이다.
[데이터 전달하기]
모체 액티비티에서 프래그먼트 액티비티에게 데이터를 전달해야한다면, 프래그먼트 액티비티에선 하나의 메소드를 구현한다. 그리고 onCreateView에서 넘겨받은 데이터가 있는지 검사하고, 필요에 따라 UI를 변경하는 등의 작업을 수행하면 된다.
public class PartnersListActivity extends Fragment {
public static PartnersListActivity newInstance(String param) {
Bundle args = new Bundle();
args.putString("key", param);
PartnersListActivity fragment = new PartnersListActivity();
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.activity_partners_list, container, false);
if (getArguments() != null) {
String val = getArguments().getString("key");
Log.e("getArguments", val);
}
return view;
}
}
위처럼 프래그먼트를 상속받는 액티비티 클래스를 변경한다.
매개변수 String param은 모체 액티비티에서 프래그먼트를 연결할 때 넘겨주어야 하며, onCreateView에서 이후 처리를 수행한다.
그리고 예제를 위해 모체 액티비티를 아래와 같이 변경하면
public class IncludeActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_include);
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(R.id.ll_fragment, PartnersListActivity.newInstance("test"));
transaction.commit();
}
}
test라는 변수를 전달하면 된다. 그리고 로그를 찍었을 때
이렇게 확인할 수 있다.
'Android(기능)' 카테고리의 다른 글
[Android] Textfield의 setText("")와 getText().clear() (0) | 2019.11.04 |
---|---|
[Android] Sqlite Update Date 및 Mysql Update Date (0) | 2019.11.04 |
[Android] XML Parsing, URL로부터 XML 파싱하기(RSS 데이터) (0) | 2019.07.05 |
[Android] SharedPreference 암호화? 안드로이드 KeyStore에 대한 설명 (2) | 2019.06.28 |
[Android] 현재 날짜, 형식, 시간, 분 구하기 / 날짜 차이 구하기 (0) | 2019.06.12 |