Fragment切换的问题

移动开发 码拜 4年前 (2017-04-29) 555次浏览
[code=java]
public class MainActivity extends AppCompatActivity implements FragmentOne.FOneBtnClickListener,FragmentTwo.FTwoBtnClickListener {
private FragmentOne fone;
private FragmentTwo ftwo;
private FragmentThree fthree;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
fone=new FragmentOne();
FragmentManager fm=getFragmentManager();
FragmentTransaction ft=fm.beginTransaction();
ft.add(R.id.id_content,fone,”one”);
ft.commit();
}
@Override
public void onFOneBtnClicker()
{//第一个按钮的回调函数
if (ftwo==null)
{
ftwo=new FragmentTwo();
ftwo.setfTwoBtnClickListener(this);
}
FragmentManager fm=getFragmentManager();
FragmentTransaction ft=fm.beginTransaction();
ft.add(R.id.id_content,ftwo,”two”);
ft.addToBackStack(null);
ft.commit();
}
@Override
public void onFTwoBtnClick() {//第二个函数的回调函数
if(fthree==null)
{
fthree=new FragmentThree();
}
FragmentManager fm=getFragmentManager();
FragmentTransaction ft=fm.beginTransaction();
ft.add(R.id.id_content,fthree,”three”);
ft.addToBackStack(null);
ft.commit();
}
}
//第一个Fragment
public class FragmentOne extends Fragment implements View.OnClickListener{
private Button mybut;
public interface  FOneBtnClickListener
{
void  onFOneBtnClicker();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
// Inflate the layout for this fragment
View view=inflater.inflate(R.layout.fragment_fragment_one, container, false);
mybut = (Button) view.findViewById(R.id.id_fragment_one_btn);
mybut.setOnClickListener(this);
return view;
}
@Override
public void onClick(View v)
{
if (getActivity() instanceof FOneBtnClickListener )
{
((FOneBtnClickListener) getActivity()).onFOneBtnClicker();
}
}
}
//第二个Fragment
public class FragmentTwo extends Fragment implements View.OnClickListener{
private Button mBtn ;
private FTwoBtnClickListener fTwoBtnClickListener ;
public interface FTwoBtnClickListener//回调接口
{
void onFTwoBtnClick();
}
 public void setfTwoBtnClickListener(FTwoBtnClickListener fTwoBtnClickListener)
{
this.fTwoBtnClickListener = fTwoBtnClickListener;
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view= inflater.inflate(R.layout.fragment_fragment_two, container, false);
mBtn = (Button) view.findViewById(R.id.id_fragment_two_btn);
mBtn.setOnClickListener(this);
return view ;
}
@Override
public void onClick(View v)
{
if (fTwoBtnClickListener!=null)
{
fTwoBtnClickListener.onFTwoBtnClick();
}
}
}
//第三个Fragment
public class FragmentThree extends Fragment implements View.OnClickListener{
private Button mBtn;
public FragmentThree() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_fragment_three, container, false);
mBtn = (Button) view.findViewById(R.id.id_fragment_three_btn);
mBtn.setOnClickListener(this);
return view;
}
@Override
public void onClick(View v) {
Toast.makeText(getActivity(), ” i am a btn in Fragment three”,
Toast.LENGTH_SHORT).show();
}
}
上边代码的功能就是在一个Activity中实现3个Fragment的切换,activity刚刚加载的时候显示的是第一个Fragment,然后点击第一个Fragment上边的按钮就会跳转到第二个Fragment,然后点击第二个Fragment上边的按钮的时候就会跳转到第三个Fragment,但是为什么FragmentOne只需要编写一个回调接口就可以了,而FragmentTwo还需要实现一个setfTwoBtnClickListener方法呢?activity中ftwo.setfTwoBtnClickListener(this),这句是什么作用呢?
解决方案

30

原因是fragment实例是属于activity, 从第一个fra跳转到第二个,要访问第二个fra,那么久必须通过activity去访问,所以必须在fra里面定义接口,然后activity实现接口,这样fra就可以执行activity的方法,实现跳转效果。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明Fragment切换的问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)