Android 에서 Fragment 의 로 딩 방식 과 데이터 통신 에 대한 상세 한 설명

11493 단어 androidfragment
1.로 딩 방식
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();
 }
}
이상 은 본 고의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.또한 저 희 를 많이 지지 해 주시 기 바 랍 니 다!

좋은 웹페이지 즐겨찾기