Android学习第六天-碎片
2018-01-27 02:11
204 查看
碎片(Fragment)是一种嵌在活动中的UI片段,它能让程序更加合和充分的利用大屏幕的空间,在平板上的到非常广泛的应用;其在学习起来十分的方便,和活动大同小异。 首先我们来写一个最简单的碎片来练习一下,即在一个活动中添加两个碎片,两个碎片平分空间,代码如下 新建一个左侧碎片布局
<?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>
同样的方法新建一个右侧的碎片,代码如下:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:background="#00ff00" 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="you are right" /> </LinearLayout>
然后就是在java下新建一个类,leftFragement和rightFragement用来将其引用在主活动中,代码如下:
public class leftFragement extends Fragment { @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.left_fragemen,container,false); return view; } } public class rightFragement extends Fragment { @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.right_fragemen,container,false); return view; } }
我们在这里面重写了onCreateView方法,但是我们要引用,这两个碎片,还需修改activity_main中的代码:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.pc123.left_fragement.MainActivity"> <fragment android:id="@+id/left_frament" android:name="com.example.pc123.left_fragement.leftFragement" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" /> <fragment android:id="@+id/right_fragment" android:name="com.example.pc123.left_fragement.rightFragement" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1"/> </LinearLayout>
我们使用了fragment标签在布局中添加标签,最重要的一点就是要指明要添加碎片的类名,注意要把包名也加上。效果如下
以上就是最简单的碎片的使用,接下来我们探究一下碎片的精髓所在,那就是动态加载
我们在layout中新建一个布局another_right_fragment用来动态加载,代码如下:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:background="#ffff00" 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 fragment" /> </LinearLayout>
然后在Java下新建一个anotherrightfragment的类,用来实现一些方法,代码如下:
public class anotherrightfragment extends Fragment { @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.another_right_fragment,container,false); return view; } }
我们在activity——main中修改代码:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.pc123.left_fragement.MainActivity"> <fragment android:id="@+id/left_frament" android:name="com.example.pc123.left_fragement.leftFragement" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" /> <FrameLayout android:id="@+id/right_layout" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" > </FrameLayout> </LinearLayout>
大家可以看到我们将右侧的碎片替代为FrameLayout,这是一个非常简单的布局,因为我们只需在布局中添加一个简单的碎片,所以我们就是用了这种最简单的布局。
接下来就是实现动态加载的关键所在,即修改Mainavtivity中的代码,修改如下:
package com.example.pc123.left_fragement; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentTransaction; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; 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 rightFragement()); } @Override public void onClick(View view) { switch (view.getId()){ case R.id.button: replaceFragment(new anotherrightfragment()); break; default: break; } } private void replaceFragment(Fragment fragement) { android.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction transaction = fragmentManager.beginTransaction(); transaction.replace(R.id.right_layout,fragement); transaction.commit(); } }
效果如图(再点击左侧按钮之后,上面的绿色图片变为黄色)
这就是动态加载碎片,具体步骤可分为5步,步骤如下:
创建待添加的代码实例
获取FragmentManager,在活动中可以直接调用getSupportFragmentManager()方法得到。
开启一个事务,通过beginTransaction()方法开启。
向容器内添加或者替换碎片,一般使用replace()方法实现,需要传入容器的id和待添加的碎片实例。
提交事务,调用commit()方法实现。
在碎片中模拟返回栈
在上面界面按下back键直接退出,我们想让其按下back键返回上一个碎片,这就是我们要做的。
我们的FragmentTranscation中提供了一个addBackStack()方法,可以用于将一个事务添加到返回栈中,修改Mainactivity中代码如下:
... private void replaceFragment(Fragment fragement) { android.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction transaction = fragmentManager.beginTransaction(); transaction.replace(R.id.right_layout,fragement); transaction.addToBackStack(null) //在提交事务之前调用,接受一个名字用于描述返回栈的状态 transaction.commit(); } ...
碎片于活动之间的通信
我们写了这么多发现在活动与碎片之间的练习并不紧密,于是在FragmentManager中提供了一个类似于findViewByid()方法,专门用于从布局文件中获取碎片实例,代码如下:
RightFragment rightFragmrnt = (RightFragment)getSupportFragmentManager() .findFragmentById(R.id.right_fragment);
在碎片中调用活动:在每个碎片中都可以通过调用getActivity()方法来得到和当前碎片相关联的活动实例,代码如下:
MainActivity activity = (MainActivity)getActivity();
以上就是今天的全部内容。
相关文章推荐
- Android学习第六天---progreessbar
- 跟Google学习Android开发-起始篇-用碎片构建一个动态的用户界面(2)
- Java -Android 学习(第六天)
- 七、Android学习第六天——SQLite与文件下载(转)
- android碎片学习笔记
- android学习八(android碎片fragment的使用)
- Android学习第六天---activity2
- Android学习第六天之组件篇初探Activity1.1
- Android学习之碎片与活动之间的通信
- Android学习之简单地使用碎片
- Android学习碎片(三)——Handler、Message、Runnable之间的联系①
- 学习android第六天
- Android学习第六天-JDB
- 跟随大神的脚步学习之Fragment:Android Fragment完全解析,关于碎片你所需知道的一切
- 跟Google学习Android开发-起始篇-用碎片构建一个动态的用户界面(4)
- Android学习之碎片的生命周期
- 跟Google学习Android开发-起始篇-用碎片构建一个动态的用户界面(1)
- Android学习碎片(一)——startActivityForResult
- Android学习第六天---seekbar
- 跟Google学习Android开发-起始篇-用碎片构建一个动态的用户界面(3)