【直接切入主题】:
相信这个时候的你一定建立好了1个以上的fragment,只是苦于切换操作怎么走?
希望做到的是,在fragmentA点击了什么可以切换到fragmentB
但是所有的Fragment都是托管于该绑定的Activity
想要自己切换,没门!想要切换,必须先问过老大Activity的同意,然后老大来切换!
这块看的不懂得建议看我博客“Fragment”里面的章节,老大与小弟的故事。
那接下来我们的逻辑是,每个需要切换的Fragment写个报告书给老大,报告切换,这个似乎是比较简单的方法。
也是正确的,只是每个fagment写的报告书异曲同工,如何缩减工作量呢?
【抽象类和什么事情都交给老大去做就好了】
首先看下Fragment要做的事情
view=View.inflate(main, R.layout.create_frame, null);
所有的fragment都要做的事情,于是我们做个抽象类,写抽象方法,去替代这个重复的方法。
代码如下:
package com.example.testdrawerlayoutleft; import android.app.Fragment; import android.app.FragmentManager; import android.app.FragmentTransaction; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; public abstract class BaseFragment extends Fragment { public Main main; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { main = (Main) getActivity(); View view = initView(); return view; } public abstract View initView(); }
然后让每个fagment去继承这个抽象类:
package com.example.testdrawerlayoutleft; import android.app.Fragment; import android.app.FragmentManager; import android.app.FragmentTransaction; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; public class fragment_content extends BaseFragment { private View view; private Button create; @Override public View initView() { // TODO Auto-generated method stub if(view==null){ view=View.inflate(main, R.layout.fragment_content, null); create=(Button)view.findViewById(R.id.creat_bt); create.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub // Toast.makeText(main, "sdsd", 100).show(); main.switchFragment("content", "create"); } }); } return view; } }
这里设置点击,此按钮跳转到另外一个Fragment
那么我们的Activity可以这样写:
public void switchFragment(String fromTag, String toTag) { Fragment from = fragmentManager.findFragmentByTag(fromTag); Fragment to = fragmentManager.findFragmentByTag(toTag); if (mCurrentFragment != to) { mCurrentFragment = to; FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); if (!to.isAdded()) {//判断是否被添加到了Activity里面去了 fragmentTransaction.hide(from).add(R.id.content_frame, to).commit(); } else { fragmentTransaction.hide(from).show(to).commit(); } } } /**
【注意的坑】:
FragmentManager 第一次创建后就可以一直使用fragmentManager对象
但是!!!!!!FragmentTransaction fragmentTransaction每次在切换添加的时候必须重新声明一次,要不
会出现加载不出来崩溃的想象,看了很多博客,使用的时候必须每次用,每次声明,具体原理不知,待找到原理再来告知,但是这个坑!!务必慎重踏
到这里基本全部结束
最后只要在Main Activity里面加入显示代码:
fragmentManager = getFragmentManager(); fragmentTransaction = fragmentManager .beginTransaction(); fragmentTransaction.add(R.id.content_frame,fragment_content, "content").add(R.id.content_frame,Create_frame, "create").hide(Create_frame).commit();
main的xml文件如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <android.support.v4.widget.DrawerLayout android:id="@+id/drawlayout" android:layout_width="match_parent" android:layout_height="match_parent" > <!-- 中间的主题显示区域 --> <FrameLayout android:id="@+id/content_frame" android:layout_width="match_parent" android:layout_height="match_parent" > </FrameLayout> <FrameLayout android:id="@+id/content_frame1" android:layout_width="match_parent" android:layout_height="match_parent" > </FrameLayout> <!-- 左边的侧滑菜单 --> <ListView android:id="@+id/lv_leftmenu" android:layout_width="240dp" android:layout_height="match_parent" android:layout_gravity="start" android:background="#ffc" > </ListView> </android.support.v4.widget.DrawerLayout> </LinearLayout>
最后:
就是使用DrawLayout的时候,存在的Framelayout冲突,虽然不知道为什么DrawLayout一定需要FrameLayout但是Fragment需要的显示contianer 不可以是DrawLayout 发现一旦使用一样的直接崩溃,解决的方法简单就是再写一个FrameLayout作为显示布局,看起来解决方便,但是当时发现时这个问题的时候已经过去了两天,也算是一个大坑级别了。
示例代码demo 在下面下载使用,有任何问题可以评论联系。
相关推荐
Button则是Android中最常见的交互元素,用户点击后通常会触发某种操作,如跳转到新的界面或执行某个功能。 实现"android菜单导航(Fragment+Button)"的步骤如下: 1. **创建Fragment**:首先,我们需要创建一个或...
在`FragmentA`的布局文件中,我们会有一个按钮`button_to_fragment_b`,点击该按钮会将用户带到`FragmentB`。 ```xml <!-- fragment_a.xml --> 这是Fragment A" /> <Button android:id="@+id/button_to_...
通过定义一个导航图(nav_graph.xml),可以方便地在多个Fragment之间跳转,同时支持回退栈管理。 在"FragmentDemo"这个项目中,你可以找到上述步骤的具体实现。通过学习和运行这个Demo,你应该能更好地理解和掌握...
Android 实现点击按钮切换不同的 Fragment 布局 Android 实现点击按钮切换不同的 Fragment 布局是 Android 应用程序中常见的一种交互方式,通过点击按钮可以切换到不同的 Fragment 布局,从而实现不同的功能。下面...
可以使用Adapter将数据绑定到列表视图上,同时提供点击事件处理,以便用户点击联系人时跳转到相应的聊天界面。 3. 发现Fragment:这部分可能包含朋友圈、扫一扫、摇一摇等功能。每个功能可以通过单独的Fragment或者...
8.使用Activity里定义的Button按钮,完成用户通过点击,退出二维码扫描界面的操作 //点击退出按钮就退出扫描二维码的界面 @Override public void onClick(View v) { switch (v.getId()) { case R.id.second_button1:...
8. Fragment:除了活动,Android还提供了Fragment组件,可以在一个活动中嵌套多个界面片段,增强了界面的灵活性和可重用性。 通过理解并熟练运用上述知识点,开发者可以构建出功能强大且用户体验优良的Android手机...
在Android中,`Button`是用于用户交互的基本组件,它可以响应用户的点击事件。在这个例子中,底部菜单栏通常会包含多个按钮,每个按钮代表一个不同的功能模块,如“聊天”、“发现”、“我”。开发者可以通过XML...
// 处理菜单项点击事件,例如切换Fragment switch (item.getItemId()) { case R.id.nav_home: // 跳转到主页 break; case R.id.nav_profile: // 跳转到个人资料页 break; // ... } drawer.closeDrawer...
Android 提供了多种布局管理器来构建用户界面,如LinearLayout、RelativeLayout、FrameLayout等。其中,AbsoluteLayout允许开发者指定精确的坐标,但不推荐使用,因为它不适应各种屏幕尺寸。 6. **Tab 与 HostTab ...
9. **Fragment**: Fragment是Android 3.0引入的概念,可以在Activity中添加和管理多个界面片段,有助于实现更灵活的界面设计,尤其在平板设备上。 10. **XML布局**: Android UI通常使用XML文件定义,这种声明式编程...
10. **Fragment**:Fragment是Android 3.0引入的新概念,它可以在Activity中嵌入多个视图,增强了界面的复用性和灵活性。 11. **IntentFilter**:IntentFilter用于指定一个组件愿意接收哪种类型的Intent,常用于...
- 调用`startActivity()`方法完成跳转。 7. **启动Activity并返回结果** - 使用`startActivityForResult()`方法启动Activity,并等待结果。 - 结果通过`onActivityResult()`回调接收。 8. **关闭Activity** - ...
最后,通过`ViewPager.OnPageChangeListener`监听页面的滑动事件,当页面改变时,更新对应的圆点状态,同时在最后一个页面显示“开始体验”的按钮,用户点击后可以跳转到主应用界面。 总之,通过`ViewPager`,我们...