怎么样在fragment中点击按钮切换到另一个fragment中

Android 码拜 4年前 (2016-03-26) 401次浏览
一共有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();
	}
}
解决方案

100

引用:
Quote: 引用:
Quote: 引用:
Quote: 引用:

既然每个fragment里面都有这4个按钮跳转到相应的fragment,为什么不把这四个按钮写在依附的activity
上面呢?
这样在对应的Activity上面声明这四个fragment,点击按钮直接用replace方法就可以切换对应的fragment了啊。
不知道你的布局是什么样子,不晓得能解决你的问题不….

这样的本人会写,而且在MainActivity类里面也已经写了,你可以看本人MainActiivity后半部分的代码,而且是有效果的。
但就是不知道为什么在Fragment里面写的四个按钮,同样使用replace方法,按下却不能跳转到其他的Fragment里。
你知道什么问题吗?是不是本人咋Fragment里面调用托管的Activity的方法有问题?

看了下你的代码,本人觉得问题可能出现在ContactFragment类的第二行。
也就是MainActivity activity = (MainActivity) getActivity();
你等于是本人声明了一个MainActivity,并且将getActivity()得到的fragment所依附的activity赋值给了它。
而你后面的操作全部都是对你本人的声明的那个activity进行操作,而跟fragment所依附的activity完全没关系。
你可以试试不要声明activity,而事实上我们一般也不会声明activity的吧,只要要用到activity,
都直接getActivity()就好了。

本人试了一下,把MainActivity activity=(MainActivity)getActivity();这行代码放到onclick方法了,就可以了!终于弄好了
但是这是什么原因?怎么样在fragment中点击按钮切换到另一个fragment中

好吧,假如这样也能好了的话,那本人前面的分析就是错的了。本人从来没有在其他类中声明过activity,所以对他的理解
还不是很正确。原因本人还真不知道了,没能帮到你,sorry。


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明怎么样在fragment中点击按钮切换到另一个fragment中
喜欢 (0)
[1034331897@qq.com]
分享 (0)