当前位置:   article > 正文

Fragment里面点击button跳转及DrawLayout Framelayout冲突

fragment中使用button

【直接切入主题】:

相信这个时候的你一定建立好了1个以上的fragment,只是苦于切换操作怎么走?

希望做到的是,在fragmentA点击了什么可以切换到fragmentB

但是所有的Fragment都是托管于该绑定的Activity

想要自己切换,没门!想要切换,必须先问过老大Activity的同意,然后老大来切换!

这块看的不懂得建议看我博客“Fragment”里面的章节,老大与小弟的故事。

那接下来我们的逻辑是,每个需要切换的Fragment写个报告书给老大,报告切换,这个似乎是比较简单的方法。

也是正确的,只是每个fagment写的报告书异曲同工,如何缩减工作量呢?

 

【抽象类和什么事情都交给老大去做就好了】

首先看下Fragment要做的事情

view=View.inflate(main, R.layout.create_frame, null);

 所有的fragment都要做的事情,于是我们做个抽象类,写抽象方法,去替代这个重复的方法。

代码如下:

  1. package com.example.testdrawerlayoutleft;
  2. import android.app.Fragment;
  3. import android.app.FragmentManager;
  4. import android.app.FragmentTransaction;
  5. import android.os.Bundle;
  6. import android.view.LayoutInflater;
  7. import android.view.View;
  8. import android.view.View.OnClickListener;
  9. import android.view.ViewGroup;
  10. import android.widget.Button;
  11. import android.widget.ImageView;
  12. import android.widget.TextView;
  13. import android.widget.Toast;
  14. public abstract class BaseFragment extends Fragment {
  15. public Main main;
  16. @Override
  17. public View onCreateView(LayoutInflater inflater, ViewGroup container,
  18. Bundle savedInstanceState) {
  19. main = (Main) getActivity();
  20. View view = initView();
  21. return view;
  22. }
  23. public abstract View initView();
  24. }

 然后让每个fagment去继承这个抽象类:

  1. package com.example.testdrawerlayoutleft;
  2. import android.app.Fragment;
  3. import android.app.FragmentManager;
  4. import android.app.FragmentTransaction;
  5. import android.os.Bundle;
  6. import android.view.LayoutInflater;
  7. import android.view.View;
  8. import android.view.View.OnClickListener;
  9. import android.view.ViewGroup;
  10. import android.widget.Button;
  11. import android.widget.ImageView;
  12. import android.widget.TextView;
  13. import android.widget.Toast;
  14. public class fragment_content extends BaseFragment {
  15. private View view;
  16. private Button create;
  17. @Override
  18. public View initView() {
  19. // TODO Auto-generated method stub
  20. if(view==null){
  21. view=View.inflate(main, R.layout.fragment_content, null);
  22. create=(Button)view.findViewById(R.id.creat_bt);
  23. create.setOnClickListener(new OnClickListener() {
  24. @Override
  25. public void onClick(View v) {
  26. // TODO Auto-generated method stub
  27. // Toast.makeText(main, "sdsd", 100).show();
  28. main.switchFragment("content", "create");
  29. }
  30. });
  31. }
  32. return view;
  33. }
  34. }

 这里设置点击,此按钮跳转到另外一个Fragment

那么我们的Activity可以这样写:

  1. public void switchFragment(String fromTag, String toTag) {
  2. Fragment from = fragmentManager.findFragmentByTag(fromTag);
  3. Fragment to = fragmentManager.findFragmentByTag(toTag);
  4. if (mCurrentFragment != to) {
  5. mCurrentFragment = to;
  6. FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
  7. if (!to.isAdded()) {//判断是否被添加到了Activity里面去了
  8. fragmentTransaction.hide(from).add(R.id.content_frame, to).commit();
  9. } else {
  10. fragmentTransaction.hide(from).show(to).commit();
  11. }
  12. }
  13. }
  14. /**

 【注意的坑】:

FragmentManager 第一次创建后就可以一直使用fragmentManager对象

但是!!!!!!FragmentTransaction fragmentTransaction每次在切换添加的时候必须重新声明一次,要不

会出现加载不出来崩溃的想象,看了很多博客,使用的时候必须每次用,每次声明,具体原理不知,待找到原理再来告知,但是这个坑!!务必慎重踏

 

 

到这里基本全部结束

最后只要在Main Activity里面加入显示代码:

  1. fragmentManager = getFragmentManager();
  2. fragmentTransaction = fragmentManager
  3. .beginTransaction();
  4. fragmentTransaction.add(R.id.content_frame,fragment_content, "content").add(R.id.content_frame,Create_frame, "create").hide(Create_frame).commit();

 main的xml文件如下:

  1. <LinearLayout
  2. xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent" >
  5. <android.support.v4.widget.DrawerLayout
  6. android:id="@+id/drawlayout"
  7. android:layout_width="match_parent"
  8. android:layout_height="match_parent" >
  9. <!-- 中间的主题显示区域 -->
  10. <FrameLayout
  11. android:id="@+id/content_frame"
  12. android:layout_width="match_parent"
  13. android:layout_height="match_parent" >
  14. </FrameLayout>
  15. <FrameLayout
  16. android:id="@+id/content_frame1"
  17. android:layout_width="match_parent"
  18. android:layout_height="match_parent" >
  19. </FrameLayout>
  20. <!-- 左边的侧滑菜单 -->
  21. <ListView
  22. android:id="@+id/lv_leftmenu"
  23. android:layout_width="240dp"
  24. android:layout_height="match_parent"
  25. android:layout_gravity="start"
  26. android:background="#ffc" >
  27. </ListView>
  28. </android.support.v4.widget.DrawerLayout>
  29. </LinearLayout>

 最后:

就是使用DrawLayout的时候,存在的Framelayout冲突,虽然不知道为什么DrawLayout一定需要FrameLayout但是Fragment需要的显示contianer 不可以是DrawLayout 发现一旦使用一样的直接崩溃,解决的方法简单就是再写一个FrameLayout作为显示布局,看起来解决方便,但是当时发现时这个问题的时候已经过去了两天,也算是一个大坑级别了。

示例代码demo 在下面下载使用,有任何问题可以评论联系。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/279662
推荐阅读
相关标签
  

闽ICP备14008679号