Android 에서 Fragment 의 로 딩 방식 과 데이터 통신 에 대한 상세 한 설명
1.정적 로드
1.1 로 딩 절차
(1)fragment 만 들 기:Fragment 클래스 를 만 들 고 Fragment 클래스 와 Fragment 보 기 를 연결 합 니 다(layot 를 View 로 변환)
View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
inflater 는 Fragment 의 레이아웃 파일 을 연결 하 는 동시에 이 레이아웃 을 View 대상 으로 변환 하고 되 돌려 줍 니 다.container 는 Fragment 의 UI 가 있 는 부모 용기 입 니 다.Fragment 에 표 시 된 UI 를 되 돌려 줍 니 다.표시 되 지 않 으 면 null 을 되 돌려 줍 니 다.inflate(int resource, ViewGroup root, boolean attachToRoot)
resource 가 Fragment 로 불 러 올 레이아웃 파일;root 는 Fragment 를 불 러 오 는 부모 View Group,즉 onCreate View 가 전달 하 는 container 입 니 다.attachToRoot 는 부모 뷰 그룹 으로 돌아 갈 지 여부 입 니 다.(2)fragment 사용:부모 보기에 fragment 를 도입 합 니 다.정적 로 딩 은 name 속성 과 유일한 식별 자 를 지정 해 야 합 니 다.식별 자 는 id 또는 tag 일 수 있 습 니 다.
<!-- layout Fragment , “ . ” -->
android:name
<!-- ,id tag , -->
android:id
android:tag
(3)감청 이벤트:부모 보기 에 대응 하 는 클래스 에 감청 이 벤트 를 설정 하면 fragment 의 하위 구성 요 소 를 직접 방문 할 수 있 습 니 다.Fragment 클래스 에 설정 하면 inflate()를 통 해 돌아 오 는 View 대상 을 통 해 Fragment 의 하위 구성 요소(view.findViewById(id)에 접근해 야 합 니 다.1.2 단순 범례
MyFragment 보기:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/fragment_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
MyFragment 클래스:
public class MyFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// layout View
View view = inflater.inflate(R.layout.myfragment, container, false);
// view
TextView textView = (TextView) view.findViewById(R.id.fragment_text);
textView.setText(" fragment");
// Fragment UI
return view;
}
}
fragment 의 부모 보기 참조:
<?xml version="1.0" encoding="utf-8"?>
<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" tools:context="com.studying.StaticFragmentActivity">
<fragment
android:tag="fragment"
android:name="com.joahyau.studying.MyFragment"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
부모 보기 에 대응 하 는 클래스 설정 이벤트 감청:
public class StaticFragmentActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_static_fragment);
// findViewById
findViewById(R.id.fragment_text).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(StaticFragmentActivity.this, " ", Toast.LENGTH_SHORT).show();
}
});
}
}
2.동적 로드2.1 로 딩 절차
(1)트 랜 잭 션 관리자 가 져 오기:Fragment 에 대한 추가,제거,교체 등 작업 은 모두 트 랜 잭 션 입 니 다.다음 코드 를 통 해 사무 관리 자 를 가 져 와 서 fragment 를 동적 으로 조작 해 야 합 니 다.
FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
(2)Fragment 대상 만 들 기:불 러 올 fragment 를 만 든 다음 add 나 replace 등 방법 으로 동적 불 러 옵 니 다.2.2 간단 한 범례
레이아웃:
<?xml version="1.0" encoding="utf-8"?>
<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="io.github.joahyau.studying.DynamicFragmentActivity">
<Button
android:id="@+id/load"
android:text=" "
android:layout_width="match_parent"
android:layout_height="80dp" />
<LinearLayout
android:id="@+id/container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal" />
</LinearLayout>
Java:
public class DynamicFragmentActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_dynamic_fragment);
findViewById(R.id.load).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
// fragment, id container
MyFragment myFragment = new MyFragment();
fragmentTransaction.add(R.id.container, myFragment);
//
fragmentTransaction.commit();
}
});
}
}
2.데이터 통신3.Activity 가 Fragment 에 데 이 터 를 전달 합 니 다.
3.1 Activity 가 동적 으로 불 러 온 Fragment 에 데 이 터 를 전달 합 니 다.
(1)Activity 에서 Fragment 대상 가 져 오기;
(2)Bundle 대상 을 만 들 고 데 이 터 를 전송 합 니 다.
(3)Bundle 대상 을 Fragment 대상 에 게 전달 하기;
(4)Fragment 에서 Bundle 대상 을 가 져 오고 가방 을 뜯 어 데 이 터 를 얻 습 니 다.
범례:Activity 에는 하나의 id 가 send 인 Button 만 있 고 MyFragment 에는 하나의 TextView 만 있 습 니 다.여 기 는 레이아웃 코드 를 넣 지 않 습 니 다.
Activity:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.send).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Fragment
MyFragment myFragment = new MyFragment();
// Bundle
Bundle bundle = new Bundle();
bundle.putString("info", " Fragment ");
myFragment.setArguments(bundle);
// Fragment
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction beginTransaction = fragmentManager.beginTransaction();
beginTransaction.add(R.id.layout, myFragment, "myfragment");
beginTransaction.commit();
}
});
}
}
Fragment:
public class MyFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.my_fragment, container, false);
TextView tv = (TextView) view.findViewById(R.id.text);
//
String text = getArguments().get("info") + "";
tv.setText(text);
return view;
}
}
3.2 Activity 가 정적 으로 불 러 온 Fragment 에 데 이 터 를 전달 합 니 다.(1)Fragment 에서 용기 의 데이터 대상 을 만 들 고 getter 와 setter 를 만 듭 니 다.
(2)Activity 에서 Fragment Manager 가 져 오기;
(3)사무 관리자 의 findFragment ById 또는 findFragment ByTag 방법 을 통 해 fragment 대상 을 얻는다.
(4)획득 한 fragment 대상 을 통 해 용기 의 setter 방법 으로 값 을 전달 합 니 다.
범례:이 레이아웃 은 동적 으로 불 러 오 는 레이아웃 과 유일 하 게 다른 것 은 send 단 추 를 Fragment 에 넣 는 것 입 니 다.다른 것 은 같 습 니 다.
Fragment:
public class MyFragment extends Fragment {
private Button btn;
private String received;//
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.my_fragment, container, false);
TextView tv = (TextView) view.findViewById(R.id.text);
tv.setText(" Fragment");
btn = (Button) view.findViewById(R.id.send);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getActivity(), " \"" + getReceived() + "\"", Toast.LENGTH_SHORT).show();
}
});
return view;
}
public String getReceived() {
return received;
}
public void setReceived(String received) {
this.received = received;
}
}
Activity:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FragmentManager fragmentManager = getFragmentManager();
MyFragment myFragment = (MyFragment) fragmentManager.findFragmentById(R.id.my_fragment);
myFragment.setReceived("this is a test.");
}
}
4.Fragment 가 Activity 에 데 이 터 를 전달 합 니 다.(1)Fragment 에 리 셋 인 터 페 이 스 를 쓴다.
(2)activity 에서 이 반전 인 터 페 이 스 를 실현 하고 실 현 된 함 수 는 전송 값 에 사용 합 니 다.
(3)Fragment 에서 onAttach 를 다시 쓰 고 그 중에서 인터페이스 대상 을 만 들 고 전달 되 는 activity(제 이 해 는 이 인터페이스 가 전달 되 는 activity 의 부모 클래스 에 해당 하 는데 이 단 계 는 다 중 적 인 특성 을 사용 한 것 입 니 다).
(4)얻 은 인터페이스 대상 으로 값 을 전달한다.
Fragment:
public class MyFragment extends Fragment {
private SendData sendData;
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
//
sendData = (SendData) activity;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.my_fragment, container, false);
TextView tv = (TextView) view.findViewById(R.id.text);
tv.setText(" Fragment");
//
sendData.sendMsg("this is a test.");
return view;
}
//
public interface SendData{
void sendMsg(String str);
}
}
Activity:
public class MainActivity extends Activity implements MyFragment.SendData{
private Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn = (Button) findViewById(R.id.send);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MyFragment myFragment = new MyFragment();
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction beginTransaction = fragmentManager.beginTransaction();
beginTransaction.add(R.id.layout, myFragment);
beginTransaction.commit();
}
});
}
// SendData ,
@Override
public void sendMsg(String str) {
Toast.makeText(this, " \"" + str + "\"", Toast.LENGTH_SHORT).show();
}
}
이상 은 본 고의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.또한 저 희 를 많이 지지 해 주시 기 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.