मुझे पता है कि यह थोड़ा देर हो चुकी है, लेकिन मैं एक ही समस्या में भाग गया और शायद अगर आप इसे हल कर चुके हैं तो यह दूसरों की मदद करेगा।
व्यूपेजर के साथ पहली समस्या यह है कि एक टुकड़े का संदर्भ प्राप्त करना लगभग असंभव है। टुकड़े getItem() में गतिशील रूप से बनाए जाते हैं और इसलिए आप एक आईडी सेट नहीं कर सकते हैं और वे स्वचालित रूप से swicher द्वारा फिर से व्यवस्थित होते हैं, इसलिए आप इसे टैग द्वारा नहीं ढूंढ सकते हैं। ऐसा करने के कुछ तरीके हैं, लेकिन वे सभी कामकाज हैं। (Update data in ListFragment as part of ViewPager)
जिस तरह से मैंने इसे हल किया, वह अनिवार्य रूप से एक डबल कॉलबैक का उपयोग कर रहा था। फ्रैगमेंट ए में मुख्य गतिविधि द्वारा कार्यान्वित एक इंटरफेस है, मुख्य गतिविधि में फ्रैगमेंट बी द्वारा कार्यान्वित एक इंटरफ़ेस है। उदा। फ्रैगमेंट में एक बटन क्लिंक ए मुख्य गतिविधि में कॉलबैक फ़ंक्शन को कॉल किया जाता है, जो बदले में फ्रैगमेंट बी में कॉलबैक को कॉल करता है। नीचे दिए गए कोड को देखें। मुझे उम्मीद है कि मैंने सबकुछ पोस्ट किया है और इससे मदद मिलेगी। बीटीडब्ल्यू, मैंने केवल एक ViewPager के साथ यह कोशिश की है, लेकिन मुझे लगता है कि यह किसी भी प्रकार के फ्रैगमेंट संचार के साथ काम करेगा।
मुख्य Avtivity जावा:
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();
}
}
}
मुख्य गतिविधि 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>
टुकड़ा एक जावा:
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;
}
}
टुकड़ा एक 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>
टुकड़ा बी जावा:
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();
}
}
टुकड़ा बी 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>
आप टुकड़ा का एक उदाहरण चर बनाने के लिए कोशिश कर सकते हैं के साथ आपकी गतिविधि कक्षा में etName() 'विधि। जब आप इसे तुरंत चालू करते हैं तो चर को फ्रेगमेंट में असाइन करें। फिर आप अपनी गतिविधि से 'fragment.setName() 'को कॉल कर सकते हैं – Scott
मुझे यह समस्या है, लेकिन इसे संग्रहीत संदर्भ के माध्यम से fragment.setName() को कॉल करना समस्या नहीं है। समस्या यह है कि टुकड़े से, getActivity() शून्य वापस आती है ताकि विचारों तक पहुंचा जा सके। मैं गतिविधि से विचारों तक पहुंच सकता हूं, और, टुकड़ा विन्यास पर खंड से संबंधित विचारों में जानकारी डाल सकता है। लेकिन बाद में, getActivity() शून्य वापस आती है और क्या यह दृष्टिकोण के साथ कुछ हो सकता है जो संदर्भ के नियंत्रण ले रहा है ताकि प्राप्त हो सके वास्तव में वैधता वैध नहीं है? तो किसी को व्यूपर से दृश्य का अनुरोध करने की आवश्यकता होगी? मैं पूछ रहा हूँ। – carl