[2017-7-25]Android Learning Day3

一身转战三千里,一剑曾百万师。这篇文章主要讲述[2017-7-25]Android Learning Day3相关的知识,希望能为你提供帮助。
最近真的有点迷茫,感觉没有一个完整的教学体系很难进行下去,有的都是自己瞎捉摸,就跟以前ACM的时候一样,动不动就“这就是一道,水题暴力就行了”、“我们枚举一下所有的状态,找一下规律就行了”,mmp哟。
 
不过!!!!!!!!!!!!!!!!!!!!!!B站简直就是万能的有没有!!!!!!!!!!!!!!!!!!!!!
 
前段时间在极客学院上看到了不错的android教学,我看了看感觉教的有点乱,但是感觉很全。But!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
果然这些网站就是为了收钱哦,不过也可以理解啦。但是还是 买不起,结果嘿嘿嘿~~~~~~~~~~~~~~~~~~~~
 
废话不多说,快记录一下今天的自学!
 
1.Fragment step1:写好两个Fragment布局文件,这个和活动的布局文件好像是一样的呢

[2017-7-25]Android Learning Day3

文章图片

大概就是这个样子咯
[2017-7-25]Android Learning Day3

文章图片

左边一个右边一个,所以要写两个布局文件。
< !-- left_fragment.xml 左边的布局文件 --> < ?xml version="1.0" encoding="utf-8"?> < LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> < Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:text="Button" /> < /LinearLayout> < !-- right_fragment.xml 右边的布局文件 --> < ?xml version="1.0" encoding="utf-8"?> < LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:background="#0fa4e9" android:layout_width="match_parent" android:layout_height="match_parent"> < TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:textSize="20sp" android:text="This is right fragment!" /> < /LinearLayout>

  step2:将布局文件添加到主视图里哦
1 < !-- activity_main.xml --> 2 < ?xml version="1.0" encoding="utf-8"?> 3 < LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 4android:orientation="horizontal" 5android:layout_width="match_parent" 6android:layout_height="match_parent"> 7 8< fragment 9android:id="@+id/left_fragment" 10< !-- 这里要注意完整的包名来引入布局文件 --> 11android:name="com.liwenchi.learnfragment.LeftFragment" 12android:layout_width="0dp" 13android:layout_height="match_parent" 14android:layout_weight="1" /> 15 16< fragment 17android:id="@+id/right_fragment" 18android:name="com.liwenchi.learnfragment.RightFragment" 19android:layout_width="0dp" 20android:layout_height="match_parent" 21android:layout_weight="1" /> 22 23 < /LinearLayout>

step3:新建RightFragment类和LeftFragment类并继承自Fragment
[2017-7-25]Android Learning Day3

文章图片

public class LeftFragment extends android.support.v4.app.Fragment{ //选择v4下的Fragment @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.left_fragment, container, false); return view; } }

这样就OK啦。。。。。。。。。。。。
但其实我还是不知道这两个类在什么时候被调用的。。。。。。。。。我面向对象真的好菜啊!!!!!!!!!!!!!
2.动态创建Fragment刚才那种方法只能先写好,就不能改了,这样不好。
先写一个another_right_fragment.xml,我们想实现,点击button,让右边的碎片更新。
[2017-7-25]Android Learning Day3

文章图片
[2017-7-25]Android Learning Day3

文章图片
< ?xml version="1.0" encoding="utf-8"?> < LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:background="#9b9b9b" android:layout_width="match_parent" android:layout_height="match_parent"> < TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:textSize="20sp" android:text="This is another right ftagment!"/> < /LinearLayout>

View Code然后更新right_fragment.xml文件
< ?xml version="1.0" encoding="utf-8"?> < LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> < fragment android:id="@+id/left_fragment" android:name="com.liwenchi.learnfragment.LeftFragment" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" />
!注意这里的改动将一个静态绑定的Fragment换成了一个布局,以后将在这个布局内动态的创建或移除Fragment < FrameLayout android:id="@+id/right_layout" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" > < /FrameLayout> < /LinearLayout>

改写MainActivity.java
public class MainActivity extends AppCompatActivity implements View.OnClickListener {@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button button = (Button) findViewById(R.id.button); button.setOnClickListener(this); replaceFragment(new RightFragment()); }@Override public void onClick(View v) { switch (v.getId()) { case R.id.button: replaceFragment(new AnotherRightFragment()); 如果点击了button,那么执行replaceFragment方法 break; default: break; } }
这里创建了一个方法用来置换当前的Fragment private void replaceFragment(Fragment fragment) { FragmentManager fragmentManager = getSupportFragmentManager(); 先获取Fragmentmanager FragmentTransaction transaction = fragmentManager.beginTransaction(); 开启一个事务 transaction.replace(R.id.right_layout, fragment); 替换碎片 transaction.addToBackStack(null); 事务添加到返回栈,这样当你点击back按钮时,会返回上一个碎片 transaction.commit(); 提交事务 } }

另外还有一个方法可以返回上一个碎片
fragmentManager.popBackStack();

这样就大功告成啦!
但是!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
还有个问题,就是这个返回栈有点小漏洞比如栈内一开始是空的
{null}oncreate会添加一个碎片1
{1}我点击button再添加一个碎片2
{1,2}这时候我又点击了button,又replace了一个碎片2
{1,2,2}但是很明显,我这个栈想要维护一个不重复的序列,而且不大看的懂英文文档。。。。。。现在不知道怎么解决了。。。。。。
===============================================
Tips:在活动里获取FragmentManager是
getSupportFragmentManager();

 
在碎片类里获取FragmentManager是
getFragmentManager();

 
  动态加载布局的技巧
[2017-7-25]Android Learning Day3

文章图片

反正好像就是你创建一个layout-large文件夹,重写一个活动的xml文件,然后 系统就能很智能的判断他是大屏幕还是小屏幕。
[2017-7-25]Android Learning Day3

文章图片

[2017-7-25]Android Learning Day3

文章图片

 
 
3.碎片之间的通信
fragmentManager.findFragmentById(R.id.right_layout); 通过id调用碎片 MainActivity thisActivity = (MainActivity) getActivity(); 在碎片类中调用与之关联的活动

4.碎片的生命周期【[2017-7-25]Android Learning Day3】看视频学习......

    推荐阅读