Tôi biết điều này hơi trễ một chút, nhưng tôi đã gặp phải vấn đề tương tự và có thể nó sẽ giúp người khác nếu bạn đã giải quyết nó.
Vấn đề đầu tiên tôi tìm thấy với ViewPager là gần như không thể có được một tham chiếu đến một đoạn. Các mảnh được tạo động trong getItem() và do đó bạn không thể đặt ID và chúng được tự động gắn thẻ lại bởi người giàu hơn, do đó bạn không thể tìm thấy nó theo thẻ. Có một số cách để làm điều đó, nhưng chúng đều là cách giải quyết. (Update data in ListFragment as part of ViewPager)
Cách tôi giải quyết nó đang sử dụng về cơ bản một cuộc gọi lại kép. Đoạn A có giao diện được thực hiện bởi Hoạt động chính, Hoạt động chính có giao diện được thực hiện bởi Phân đoạn B. Ví dụ: một nút clink trong Fragment Một chức năng gọi lại trong hoạt động chính được gọi, mà lần lượt gọi các cuộc gọi lại trong Fragment B. Nhìn vào mã dưới đây. Tôi hy vọng tôi đăng tất cả mọi thứ và nó sẽ giúp đỡ. btw, tôi đã chỉ thử điều này với một ViewPager, nhưng tôi cho rằng nó sẽ làm việc với bất kỳ loại giao tiếp Fragment nào.
chính Avtivity java:
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
public class MainActivity extends FragmentActivity implements FragmentA.Caller {
SectionsPagerAdapter mSectionsPagerAdapter;
ViewPager mViewPager;
PassCallToB passOnToB = null;
FragmentManager myManager = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
mViewPager = (ViewPager) findViewById(R.id.pager);
mViewPager.setAdapter(mSectionsPagerAdapter);
}
public class SectionsPagerAdapter extends FragmentPagerAdapter {
public SectionsPagerAdapter(FragmentManager fm) {
super(fm);
MyManager = fm;
}
@Override
public Fragment getItem(int position) {
Fragment fragment = null;
if(position == 0) {
fragment = new FragmentA();
} else if (position == 1) {
fragment = new FragmentB();
passOnToB = (PassCallToB)fragment;
}
return fragment;
}
@Override
public int getCount() {
return 2;
}
@Override
public CharSequence getPageTitle(int position) {
switch (position) {
case 0:
return "Frag A";
case 1:
return "Frag B";
}
return null;
}
public void setCallback() {
List<Fragment> frags = myManager.getFragments();
for(Fragment fragment : frags) {
if(fragment instanceof FragmentB){
passOnToB = (PassCallToB)fragment;
}
}
}
}
public interface PassCallToB {
public void passItOn();
}
@Override
public void CallB() {
if(passOnToB instanceof Fragment)
passOnToB.passItOn();
else {
mSectionsPagerAdapter.setCallback();
passOnToB.passItOn();
}
}
}
chính Hoạt động xml:
<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >
<android.support.v4.view.PagerTitleStrip
android:id="@+id/pager_title_strip"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="top"
android:background="#33b5e5"
android:paddingBottom="4dp"
android:paddingTop="4dp"
android:textColor="#fff" />
</android.support.v4.view.ViewPager>
Fragment Một java:
import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
public class FragmentA extends Fragment {
Button btnCallB = null;
Caller listener = null;
public FragmentA() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle inState) {
View rootView = inflater.inflate(R.layout.fragment_a, container, false);
btnCallB = (Button)rootView.findViewById(R.id.btnCallB);
btnCallB.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
listener.CallB();
}
});
return rootView;
}
public interface Caller {
public void CallB();
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
if (activity instanceof FragmentActivity) {
listener = (Caller) activity;
} else {
throw new ClassCastException(activity.toString() + " must implemenet listener");
}
}
@Override
public void onDetach() {
super.onDetach();
listener = null;
}
}
Fragment Một xml:
<RelativeLayout 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" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:text="This is Fragment A" />
<Button
android:id="@+id/btnCallB"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/textView1"
android:text="Call Fragment B" />
</RelativeLayout>
Fragment B Java:
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
public class FragmentB extends Fragment implements MainActivity.PassCallToB {
public FragmentB() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle inState) {
View rootView = inflater.inflate(R.layout.fragment_b, container, false);
return rootView;
}
@Override
public void passItOn() {
Toast.makeText(getActivity(), "Hello from B", Toast.LENGTH_SHORT).show();
}
}
Fragment B xml:
<RelativeLayout 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" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:text="This is Fragment B" />
</RelativeLayout>
Bạn có thể cố gắng tạo ra một biến thể hiện của các Fragment với 's Phương thức etName() 'trong lớp Activity của bạn. Gán biến cho Fragment khi bạn khởi tạo nó. sau đó bạn có thể gọi 'fragment.setName()' từ hoạt động của mình – Scott
Tôi gặp sự cố này, nhưng gọi fragment.setName() qua tham chiếu được lưu trữ với nó, không phải là vấn đề. Vấn đề là từ đoạn, getActivity() trả về null để không thể truy cập các khung nhìn. Tuy nhiên, tôi có thể truy cập vào các khung nhìn từ hoạt động, và COULD mảnh đặt thông tin vào các khung nhìn thuộc về đoạn tại cấu hình. Nhưng sau đó, getActivity() trả về null và nó có thể là cái gì đó với viewPager kiểm soát ngữ cảnh sao cho getActivity thực sự không hợp lệ? Vì vậy, một trong những sẽ cần phải yêu cầu xem từ Viewpager? Tôi đang hỏi. – carl