Fragment是Android3.0后引入的一个新的API,他出现的初衷是为了适应大屏幕的平板电脑, 当然现在他仍然是平板APP UI设计的宠儿,而且我们普通手机开发也会加入这个Fragment, 我们可以把他看成一个小型的Activity,又称Activity片段!想想,如果一个很大的界面,我们 就一个布局,写起界面来会有多麻烦,而且如果组件多的话是管理起来也很麻烦!而使用Fragment 我们可以把屏幕划分成几块,然后进行分组,进行一个模块化的管理!从而可以更加方便的在 运行过程中动态地更新Activity的用户界面!另外Fragment并不能单独使用,他需要嵌套在Activity 中使用,尽管他拥有自己的生命周期,但是还是会受到宿主Activity的生命周期的影响,比如Activity 被destory销毁了,他也会跟着销毁!
Fragment的特征
1、具备生命周期
Fragment有生命周期,那么在一个activity可以使用多个Fragment,或者一个Fragment在多个activity 中重复使用,来完成一些效果
2、必须委托在activity中才能运行
则一个activity暂停,其中包含的所有的Framgment都会暂停
静态态添加Fragment:一个activity包含那几个fragment提前设置好。
实现:
android studio中通过下图方式创建fragment
创建后同时也会在res/layout下创建一个xml文件,与创建的java类绑定。
xml文件中可以自定义一些组件,如下。
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".BlankFragment1">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView"
android:textSize="30dp"/>
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="100dp"
android:text="Button" />
FrameLayout>
然后在创建的Java类中,其继承了Fragment,重写了许多方法,这块我们只对onCreateView()进行改变。(onCreateView():fragment的view视图在被创建时的动作)
package com.example.fifthdemo_framgent_01;
import android.os.Bundle;
import androidx.fragment.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
public class BlankFragment1 extends Fragment {
private View root;
private TextView textView;
private Button button;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
if (root == null) {
root = inflater.inflate(R.layout.fragment_blank1, container, false);
}
textView = root.findViewById(R.id.textView);
button = root.findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
textView.setText("button setOnClickListener");
}
});
return root;
}
}
此时,准备工作已经完成。接下来进行fragment的使用。
在要使用的界面(activity_main.xml)中设置如下代码。
<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"
android:orientation="vertical"
tools:context=".MainActivity">
<fragment
android:id="@+id/fragment1"
android:name="com.example.fifthdemo_framgent_01.BlankFragment1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"/>
<fragment
android:id="@+id/fragment2"
android:name="com.example.fifthdemo_framgent_01.BlankFragment2"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"/>
LinearLayout>
在fragment标签中,name为与java创建的Fragment进行绑定。id必须设置,因为资源管理会使用。
(一个avtivity可以包含多个fragment:上面的BlankFragment2为BlankFragment1,直接复制粘贴)
效果如下:
主要包含以下步骤:
(1)、 创建一个待处理的fragment
(2)、获取FragmentManager,一般都是通过getSupportFragmentManager()
(3)、开启一个事务transaction,一般调用fragmentManager的beginTransaction()
(4)、使用transaction进行fragment的替换 。 一般调用replace()
(5)、提交事务。调用commit()
演示
首先activity_main.xml中添加两个按钮,用于替换事件触发,然后添加一个布局,用来放置Fragment
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/bt1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="add fragment" />
<Button
android:id="@+id/bt2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="repalce" />
<FrameLayout
android:id="@+id/framelayout_1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#A68EA3"/>
LinearLayout>
然后创建两个Fragment,用于切换模拟。(这块我创建的是BlankFragment和ItemFragment2)
接着Java代码对两个按钮的点击事件设置。
package com.example.fifthdemo_fragment_02;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
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 button1 = findViewById(R.id.bt1);
button1.setOnClickListener(this);
Button button2 = findViewById(R.id.bt2);
button2.setOnClickListener(this);
}
@Override
public void onClick(View view) { //点击事件
switch (view.getId()) {
case R.id.bt1: replaceFragment(new BlankFragment1());
break;
case R.id.bt2: replaceFragment(new ItemFragment2());
break;
}
}
private void replaceFragment(Fragment fragment) {
//获取Fragment的管理器类 FragmentManager
FragmentManager fragmentManager = getSupportFragmentManager();
//获取 FragmentManager中用于 Fragment 替换之类的类 FragmentTransaction
FragmentTransaction transaction = fragmentManager.beginTransaction();
//创建一个替换Fragment的事件
transaction.replace(R.id.framelayout_1,fragment); // 替换的是framelayout_1中的fragment
//将新的Fragment对象压入一个栈内,点击back会进行回退,而非退出app
transaction.addToBackStack(null);
//提交事件
transaction.commit();
}
}
代码解释:
这块主MainActivity类实现了View.OnClickListene接口,重写onClick()作为点击事件的监听,这块设置点击id=bt1的按钮后,执行replaceFragment(),页面替换为创建的BlankFragment,另一个switch-case相同。
然后在replaceFragment(),Fragment的切换需要Fragment的管理器类 FragmentManager,进行获取
/获取Fragment的管理器类 FragmentManager
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentManager中用于 Fragment 替换之类的类为 FragmentTransaction,进行获取
FragmentTransaction transaction = fragmentManager.beginTransaction();
进行页面切换,依靠FragmentTransaction 的replace()、commit()两个方法。
//创建一个替换Fragment的事件
transaction.replace(R.id.framelayout_1,fragment); // 替换的是framelayout_1中的fragment
//提交事件
transaction.commit();
ps:页面在进行切换后,点安卓机的back键,会直接回退到桌面。要想实现回到上一个Fragment,可在FragmentTransaction 事件提交前插入以下代码:
//将新的Fragment对象压入一个栈内,点击back会进行回退,而非退出app
transaction.addToBackStack(null);
效果:
刚启动时,没有Fragment添加进来
点击 add fragment后,添加了BlankFragment
再点击replace,添加了ItemFragment,替换了BlankFragment
点击back,当前Fragment出栈,会回退到上一个BlankFragment,而非回到桌面
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)