我有一个带有 setName() 方法的片段,它通过 setText 函数更改 EditText 文本。
通过 ViewPager 从承载该片段的活动中调用该方法的最佳方法是什么?
换句话说,如何通过 ViewPager 从承载该片段的 Activity 访问片段的方法(例如,更改该片段的布局)?
我问这个是因为我尝试了几种方法,但总是出错。
我有一个带有 setName() 方法的片段,它通过 setText 函数更改 EditText 文本。
通过 ViewPager 从承载该片段的活动中调用该方法的最佳方法是什么?
换句话说,如何通过 ViewPager 从承载该片段的 Activity 访问片段的方法(例如,更改该片段的布局)?
我问这个是因为我尝试了几种方法,但总是出错。
最好的方法就是打电话
CallingFragmentName fragment = (CallingFragmentName) viewPager
.getAdapter()
.instantiateItem(viewPager, viewPager.getCurrentItem());
它将重新实例化您的调用片段,这样它就不会抛出空指针异常。
我知道这有点晚了,但我遇到了同样的问题,如果你已经解决了它,也许它会帮助其他人。
我发现 ViewPager 的第一个问题是几乎不可能获得对片段的引用。片段是在 getItem() 中动态创建的,因此您无法设置 ID,并且它们会由 swicher 自动重新标记,因此您也无法通过标记找到它。有一些方法可以做到这一点,但它们都是解决方法。(作为 ViewPager 的一部分更新 ListFragment 中的数据)
我解决它的方法本质上是使用双重回调。Fragment A 有一个由 Main Activity 实现的接口,Main Activity 有一个由 Fragment B 实现的接口。例如,在 Fragment A 中的按钮点击时,会调用 Main Activity 中的回调函数,然后调用 Fragment B 中的回调函数。看看下面的代码。我希望我发布了所有内容,它会有所帮助。顺便说一句,我只用 ViewPager 试过这个,但我认为它适用于任何类型的 Fragment 通信。
主要 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();
}
}
}
主要活动 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>
片段A 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;
}
}
片段 A 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>
片段 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();
}
}
片段 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>
您可以在ViewPager
. 您需要 (1)Fragment
在创建时存储对 的引用并将其添加到将支持您的寻呼适配器的列表中,或者 (2) 您需要从寻呼适配器本身获取对片段的引用。例如:
Fragment fragmentA = null; //instance variable
fragmenA = new Fragment(); //whereever you instantiate your fragment
如果你的方法是
public void setName(String args){
//do something
}
您所要做的就是从对您持有的片段的引用中调用该方法ViewPager
fragmentA.setName(args);
您可以传递所需的任何参数,就像调用常规方法一样。请注意,这仅在您从其包含的片段中调用方法时才有效ViewPager
or FragmentActivity
。如果你想做相反的事情,从片段到活动,你需要使用接口。
分段
private static FragmentName instance;
public static synchronized FragmentName getInstance()
{
return instance;
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
instance=this;
....
}
public void methodName()
{...}
活动
FragmentName.getInstance().methodName();