如何在fragment中点击按钮切换到另一个fragment中?

饺克力JokerLeo 2015-02-20 01:53:55
一共有4个fragment,分别是contact(联系人),friends(朋友),search(查找),more(更多)。使用的都是同一个布局,每个fragment中都有四个内部按钮,可以切换到其他的3个fragment中。
现在只考虑在contact中,实现点4个(其实有效的是3个),切换到其他3个fragment中。

现在的情况是,点击contactfragment中的按钮,toast会响应,但是fragment不会跳转。这是怎么回事,下面是两个类的代码。

这是contactfragment。

public class ContactFragment extends Fragment implements OnClickListener {
MainActivity activity = (MainActivity) getActivity();
View view = null;
Button btn_inner_contact;
Button btn_inner_friends;
Button btn_inner_search;
Button btn_inner_more;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
view = inflater.inflate(R.layout.frag_content, container, false);
TextView textview_hint = (TextView) view
.findViewById(R.id.textview_hint);
textview_hint.setText("Contact");
initComponent();
return view;
}

private void initComponent() {
btn_inner_contact = (Button) view
.findViewById(R.id.button_inner_contact);
btn_inner_friends = (Button) view
.findViewById(R.id.button_inner_friends);
btn_inner_search = (Button) view.findViewById(R.id.button_inner_search);
btn_inner_more = (Button) view.findViewById(R.id.button_inner_more);

btn_inner_contact.setOnClickListener(this);
btn_inner_friends.setOnClickListener(this);
btn_inner_search.setOnClickListener(this);
btn_inner_more.setOnClickListener(this);
}

@Override
public void onClick(View v) {

FragmentManager fm = activity.getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
switch (v.getId()) {
case R.id.button_inner_contact:
Toast.makeText(getActivity(), "点击了内部contact按钮", Toast.LENGTH_SHORT)
.show();
if (activity.contactFragment == null) {
activity.contactFragment = new ContactFragment();
}
ft.replace(R.id.framelayout_content, activity.contactFragment);

break;
case R.id.button_inner_friends:
Toast.makeText(getActivity(), "点击了内部friends按钮", Toast.LENGTH_SHORT)
if (activity.friendsFragment == null) {
activity.friendsFragment = new FriendsFragment();
}
ft.replace(R.id.framelayout_content, activity.friendsFragment);
break;
case R.id.button_inner_more:
if (activity.moreFragment == null) {
activity.moreFragment = new MoreFragment();
}
ft.replace(R.id.framelayout_content, activity.moreFragment);
break;
case R.id.button_inner_search:
if (activity.searchFragment == null) {
activity.searchFragment = new SearchFragment();
}
ft.replace(R.id.framelayout_content, activity.searchFragment);
break;
default:
break;

}
ft.commit();
}

}



这是mainactivity类,mainactivity中的那四个按钮及其响应时间是fragment外部的四个按钮,与内部的inner按钮没关系。

public class MainActivity extends Activity implements OnClickListener {
public ContactFragment contactFragment;
public FriendsFragment friendsFragment;
public MoreFragment moreFragment;
public SearchFragment searchFragment;
private Button btn_contact;
private Button btn_friends;
private Button btn_search;
private Button btn_more;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initcomponet();
initview();

}

private void initview() {
contactFragment = new ContactFragment();
FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.add(R.id.framelayout_content, contactFragment);
ft.commit();
}

private void initcomponet() {

btn_contact = (Button) findViewById(R.id.button_contact);
btn_friends = (Button) findViewById(R.id.button_friends);
btn_more = (Button) findViewById(R.id.button_more);
btn_search = (Button) findViewById(R.id.button_search);
btn_contact.setOnClickListener(this);
btn_friends.setOnClickListener(this);
btn_more.setOnClickListener(this);
btn_search.setOnClickListener(this);
}

@Override
public void onClick(View v) {
FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
switch (v.getId()) {
case R.id.button_contact:
if (contactFragment == null) {
contactFragment = new ContactFragment();
}
ft.replace(R.id.framelayout_content, contactFragment);

break;
case R.id.button_friends:
if (friendsFragment == null) {
friendsFragment = new FriendsFragment();
}
ft.replace(R.id.framelayout_content, friendsFragment);

break;
case R.id.button_more:
if (moreFragment == null) {
moreFragment = new MoreFragment();
}
ft.replace(R.id.framelayout_content, moreFragment);

break;
case R.id.button_search:
if (searchFragment == null) {
searchFragment = new SearchFragment();
}
ft.replace(R.id.framelayout_content, searchFragment);
break;

default:
break;
}
ft.commit();
}

}
...全文
58036 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
darren573 2017-07-09
  • 打赏
  • 举报
回复
如何在跳转之后保持底部item的同步?
qq_34716497 2016-09-22
  • 打赏
  • 举报
回复
FragmentManager fm = this.getFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); fragment1 = new Fragment1(); ft.replace(R.id.linear2,fragment1).commit(); 我也是用这种方式 fragment跳转至fragment 。 但是虽然能跳转成功,但是显示的还是当前的fragment的页面 。
qq_35850993 2016-08-11
  • 打赏
  • 举报
回复
getActivity()方法只有在onAttach(Activity activity)方法执行过后,才能获取被绑定的Activity的引用。你也可以在onCreateView方法中初始化activity.
wapengfeng 2016-07-04
  • 打赏
  • 举报
回复
用广播发过去 去activity执行也可以啊
u010191681 2016-03-03
  • 打赏
  • 举报
回复
你怎么能在 Fragment 获取 该依附 Activity的container
這一刻 2016-02-03
  • 打赏
  • 举报
回复
可以给我发一份demo么
caman1980 2016-01-10
  • 打赏
  • 举报
回复
有没有分析这个问题的本质原因什么? 另外我不提倡这种代码的写法,在fragement里面控制FragmentTransation是有点怪异的。
龙封 2015-02-26
  • 打赏
  • 举报
回复
引用 11 楼 wbz810 的回复:
[quote=引用 9 楼 pang376654973 的回复:] [quote=引用 8 楼 wbz810 的回复:] [quote=引用 7 楼 pang376654973 的回复:] 既然每个fragment里面都有这4个按钮跳转到相应的fragment,为什么不把这四个按钮写在依附的activity 上面呢??? 这样在对应的Activity上面声明这四个fragment,点击按钮直接用replace方法就可以切换对应的fragment了啊。 不知道你的布局是什么样子,不晓得能解决你的问题不....
这样的我会写,而且在MainActivity类里面也已经写了,你可以看我MainActiivity后半部分的代码,而且是有效果的。 但就是不知道为什么在Fragment里面写的四个按钮,同样使用replace方法,按下却不能跳转到其他的Fragment里。 你知道什么问题吗?是不是我咋Fragment里面调用托管的Activity的方法有问题?[/quote] 看了下你的代码,我觉得问题可能出现在ContactFragment类的第二行。。 也就是MainActivity activity = (MainActivity) getActivity(); 你等于是自己声明了一个MainActivity,并且将getActivity()得到的fragment所依附的activity赋值给了它。 而你后面的操作全部都是对你自己的声明的那个activity进行操作,而跟fragment所依附的activity完全没关系。 你可以试试不要声明activity,而事实上我们一般也不会声明activity的吧,只要要用到activity, 都直接getActivity()就好了。 [/quote] 我试了一下,把MainActivity activity=(MainActivity)getActivity();这行代码放到onclick方法了,就可以了!!终于弄好了 但是这是什么原因?[/quote] 好吧,如果这样也能好了的话,那我前面的分析就是错的了。我从来没有在其他类中声明过activity,所以对他的理解 还不是很正确。。原因我还真不知道了,没能帮到你,sorry。
王三的猫阿德 2015-02-26
  • 打赏
  • 举报
回复
引用 13 楼 xiaohanluo 的回复:
contactfragment中使用FramentTransaction.replace()方法后要提交要调用commit()方法。

            ft.replace(R.id.framelayout_content, activity.contactFragment);
            ft.commit();
不好意思看错了。。。。。。。。。
王三的猫阿德 2015-02-26
  • 打赏
  • 举报
回复
contactfragment中使用FramentTransaction.replace()方法后要提交要调用commit()方法。

            ft.replace(R.id.framelayout_content, activity.contactFragment);
            ft.commit();
饺克力JokerLeo 2015-02-25
  • 打赏
  • 举报
回复
引用 9 楼 pang376654973 的回复:
[quote=引用 8 楼 wbz810 的回复:] [quote=引用 7 楼 pang376654973 的回复:] 既然每个fragment里面都有这4个按钮跳转到相应的fragment,为什么不把这四个按钮写在依附的activity 上面呢??? 这样在对应的Activity上面声明这四个fragment,点击按钮直接用replace方法就可以切换对应的fragment了啊。 不知道你的布局是什么样子,不晓得能解决你的问题不....
这样的我会写,而且在MainActivity类里面也已经写了,你可以看我MainActiivity后半部分的代码,而且是有效果的。 但就是不知道为什么在Fragment里面写的四个按钮,同样使用replace方法,按下却不能跳转到其他的Fragment里。 你知道什么问题吗?是不是我咋Fragment里面调用托管的Activity的方法有问题?[/quote] 看了下你的代码,我觉得问题可能出现在ContactFragment类的第二行。。 也就是MainActivity activity = (MainActivity) getActivity(); 你等于是自己声明了一个MainActivity,并且将getActivity()得到的fragment所依附的activity赋值给了它。 而你后面的操作全部都是对你自己的声明的那个activity进行操作,而跟fragment所依附的activity完全没关系。 你可以试试不要声明activity,而事实上我们一般也不会声明activity的吧,只要要用到activity, 都直接getActivity()就好了。 [/quote] 我试了一下,把MainActivity activity=(MainActivity)getActivity();这行代码放到onclick方法了,就可以了!!终于弄好了 但是这是什么原因?
饺克力JokerLeo 2015-02-25
  • 打赏
  • 举报
回复
引用 9 楼 pang376654973 的回复:
[quote=引用 8 楼 wbz810 的回复:] [quote=引用 7 楼 pang376654973 的回复:] 既然每个fragment里面都有这4个按钮跳转到相应的fragment,为什么不把这四个按钮写在依附的activity 上面呢??? 这样在对应的Activity上面声明这四个fragment,点击按钮直接用replace方法就可以切换对应的fragment了啊。 不知道你的布局是什么样子,不晓得能解决你的问题不....
这样的我会写,而且在MainActivity类里面也已经写了,你可以看我MainActiivity后半部分的代码,而且是有效果的。 但就是不知道为什么在Fragment里面写的四个按钮,同样使用replace方法,按下却不能跳转到其他的Fragment里。 你知道什么问题吗?是不是我咋Fragment里面调用托管的Activity的方法有问题?[/quote] 看了下你的代码,我觉得问题可能出现在ContactFragment类的第二行。。 也就是MainActivity activity = (MainActivity) getActivity(); 你等于是自己声明了一个MainActivity,并且将getActivity()得到的fragment所依附的activity赋值给了它。 而你后面的操作全部都是对你自己的声明的那个activity进行操作,而跟fragment所依附的activity完全没关系。 你可以试试不要声明activity,而事实上我们一般也不会声明activity的吧,只要要用到activity, 都直接getActivity()就好了。 [/quote] 我试了一下,把MainActivity activity=(MainActivity)getActivity();这行代码放到onclick方法了,就可以了!!终于弄好了 但是我还是不明白,这是什么原因?
龙封 2015-02-25
  • 打赏
  • 举报
回复
引用 8 楼 wbz810 的回复:
[quote=引用 7 楼 pang376654973 的回复:] 既然每个fragment里面都有这4个按钮跳转到相应的fragment,为什么不把这四个按钮写在依附的activity 上面呢??? 这样在对应的Activity上面声明这四个fragment,点击按钮直接用replace方法就可以切换对应的fragment了啊。 不知道你的布局是什么样子,不晓得能解决你的问题不....
这样的我会写,而且在MainActivity类里面也已经写了,你可以看我MainActiivity后半部分的代码,而且是有效果的。 但就是不知道为什么在Fragment里面写的四个按钮,同样使用replace方法,按下却不能跳转到其他的Fragment里。 你知道什么问题吗?是不是我咋Fragment里面调用托管的Activity的方法有问题?[/quote] 看了下你的代码,我觉得问题可能出现在ContactFragment类的第二行。。 也就是MainActivity activity = (MainActivity) getActivity(); 你等于是自己声明了一个MainActivity,并且将getActivity()得到的fragment所依附的activity赋值给了它。 而你后面的操作全部都是对你自己的声明的那个activity进行操作,而跟fragment所依附的activity完全没关系。 你可以试试不要声明activity,而事实上我们一般也不会声明activity的吧,只要要用到activity, 都直接getActivity()就好了。
饺克力JokerLeo 2015-02-25
  • 打赏
  • 举报
回复
引用 7 楼 pang376654973 的回复:
既然每个fragment里面都有这4个按钮跳转到相应的fragment,为什么不把这四个按钮写在依附的activity 上面呢??? 这样在对应的Activity上面声明这四个fragment,点击按钮直接用replace方法就可以切换对应的fragment了啊。 不知道你的布局是什么样子,不晓得能解决你的问题不....
这样的我会写,而且在MainActivity类里面也已经写了,你可以看我MainActiivity后半部分的代码,而且是有效果的。 但就是不知道为什么在Fragment里面写的四个按钮,同样使用replace方法,按下却不能跳转到其他的Fragment里。 你知道什么问题吗?是不是我咋Fragment里面调用托管的Activity的方法有问题?
龙封 2015-02-24
  • 打赏
  • 举报
回复
既然每个fragment里面都有这4个按钮跳转到相应的fragment,为什么不把这四个按钮写在依附的activity 上面呢??? 这样在对应的Activity上面声明这四个fragment,点击按钮直接用replace方法就可以切换对应的fragment了啊。 不知道你的布局是什么样子,不晓得能解决你的问题不....
饺克力JokerLeo 2015-02-24
  • 打赏
  • 举报
回复
引用 4 楼 u012562785 的回复:
使用intent跳转,还有,按你的想法,用tabhost不是更容易实现吗
引用 5 楼 lxfhjjsfq 的回复:
用VIewPager吧,控制好控制些
恩,我之前还不知有现成viewpager和tabhost的这种选项卡的组件,所以想用这个fragment切换的办法来实现。 但是现在就是想用Fragment来实现这个功能,有点想把这个牛角尖钻透。。。 因为fragment被托管给了所在的MainActivity,而通过getActivity方法,强制转换成MainActivity,获得被托管给的activity实例,再调用activity的getFragmentManager方法,来操作替换fragment的动作。我这个思路有问题吗。或者语句有哪里不对的地方吗。??求解答呀 4楼所说的Intent不是用来启动activity的吗?也可以用来操作fragment?求详细指教。大谢!
_xianfeng99 2015-02-23
  • 打赏
  • 举报
回复
用VIewPager吧,控制好控制些
Anthony_17 2015-02-23
  • 打赏
  • 举报
回复
使用intent跳转,还有,按你的想法,用tabhost不是更容易实现吗
饺克力JokerLeo 2015-02-23
  • 打赏
  • 举报
回复
求解答!!
饺克力JokerLeo 2015-02-20
  • 打赏
  • 举报
回复
求解答!!大神们
加载更多回复(1)

80,349

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧