Andoroid——Fragment碎片

静态添加碎片

先新建两个文件:
在这里插入图片描述
可以看到多了两个文件:
在这里插入图片描述
删除TestFragment_1的其它内容,只保留onCreateView方法:

package com.example.fragmenttest_1;

import android.os.Bundle;

import androidx.fragment.app.Fragment;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class TestFragment_1 extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_test_1, container, false);
    }
}

fragment_test_1随便写个自己喜欢的布局:

fragment_test_1.xml

<?xml version="1.0" encoding="utf-8"?>
<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/button1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="button1"
        />
    <TextView
        android:id="@+id/text1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Button1"
        android:gravity="center_horizontal"
        />

</LinearLayout>

把activity_main改一下,加上fragment,这一步就是静态添加的意思,把自己写的fragment布局加到一个main布局里去。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >
    <fragment
        android:id="@+id/fragment"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:name="com.example.fragmenttest_1.TestFragment_1"
        />

</LinearLayout>

运行一下:

请添加图片描述

运行过程应该是这样:MainActivity.java加载activity_main.xml,发现fragment,回调TestFragment_1.java中的onCreateView方法把fragment_test_1.xml布局加载进来。

这种程序发现fragment就自己去找的方式就是静态的,写死在activity_main.xml中,程序运行后不可以控制什么时候去找。

动态添加碎片

和静态一样,创建两个文件,修改方法也一样。唯一不同的,先把activity_main.xml的内容改成下面的:

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >
    <!--作为容器用-->
    <FrameLayout
        android:id="@+id/fragemnt"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        ></FrameLayout>

</LinearLayout>

这里把fragment换成了FrameLayout程序就不会找了,运行一下看看:
请添加图片描述
其实不是没去找了,因为FrameLayout(帧布局)中什么都没有,所以它在左上角却看不见。可以自己在里面加点东西,显然要加的是写好的碎片,在MainActivity.java中去写:

package com.example.fragmenttest_2;

import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;

import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        /*管理fragment并将视图添加到activity的视图层级结构中*/
        FragmentManager fm = getSupportFragmentManager();
        /*找到布局中的fragment*/
        Fragment fragment = fm.findFragmentById(R.id.fragemnt);
        /*如果容器中什么都没有*/
        if (fragment == null) {
            /*得到一个Fragment子类*/
            fragment = new FragmentTest_2();
            fm.beginTransaction()
                    /*把fragment添加到容器里,显然这个容器应该是Fragment的*/
                    .add(R.id.fragemnt, fragment)
                    .commit();
            /*然后就会自动回调Fragment子类的生命周期方法*/
        }
      	//也可以这样写
        /*获取FragmentManager*/
        //FragmentManager fragmentManager = getSupportFragmentManager();
        /*处理,开启一个事务*/
        //FragmentTransaction transaction = fragmentManager.beginTransaction();
        /*替换碎片*/
        //transaction.replace(R.id.right_layout, fragment);
		/*提交事务*/
        //transaction.commit();
    }
}

replace方法与add方法不同点在于:replace之前会先remove
在这里插入图片描述
动态添加需要一个FrameLayout容器,这个容器是定在xml文件中的,而且这个xml文件最后会被某一个Activity调用,在这个Activity中,可以使用Framgment的一些方法来把写好的碎片加载进来,加载的时机可以自己确定,所以这是动态的。

优化

因为这种动态加载方法比较通用,可以单独写一个抽象类:
SingleFragmentActivity

package com.example.fragmenttest_2;

import android.os.Bundle;

import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager;

public abstract class SingleFragmentActivity extends FragmentActivity {
    protected abstract Fragment CreateFragment();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        /*管理fragment并将视图添加到activity的视图层级结构中*/
        FragmentManager fm = getSupportFragmentManager();
        /*找到布局中的fragment*/
        Fragment fragment = fm.findFragmentById(R.id.fragemnt);
        /*如果容器中什么都没有*/
        if (fragment == null) {
            /*得到一个Fragment子类*/
            fragment = CreateFragment();
            fm.beginTransaction()
                    /*把fragment添加到容器里,显然这个容器应该是Fragment的*/
                    .add(R.id.fragemnt, fragment)
                    .commit();
            /*然后就会自动回调Fragment子类的生命周期方法*/
        }
    }
}

这里加载的Fragment子类是动态的,用一个抽象方法去获得。这个类继承自FragmentActivity

再把MainActivity改一下其他的不动。

import androidx.fragment.app.Fragment;

public class MainActivity extends SingleFragmentActivity{
    @Override
    protected Fragment CreateFragment() {
        return new FragmentTest_2();
    }
}
在Android平台上,要打开应用程序的摄像头并允许用户拍摄不受区域限制的照片或视频,你需要遵循以下步骤: 1. **添加权限**: 在`AndroidManifest.xml`文件中,添加`<uses-permission>`标签,允许访问相机: ```xml <uses-permission android:name="android.permission.CAMERA" /> <uses-feature android:name="android.hardware.camera" android:required="true" /> ``` 如果需要录像功能,还需要添加对存储权限的请求: ```xml <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> ``` 2. **初始化CameraManager**: 在Activity或Fragment中,创建一个`CameraManager`实例,并获取设备的第一个可用相机ID: ```java CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); String cameraId = cameraManager.getCameraIdList().get(0); // 获取第一个可用相机 ``` 3. **请求相机预览权限**: 使用`cameraManager.requestCameraAccess`方法请求临时使用相机权限,如果用户同意,会回调相应的处理函数。 4. **开启相机预览**: 使用`cameraManager.openCamera`方法打开相机,并设置监听器来接收预览数据: ```java try { cameraManager.openCamera(cameraId, new CameraDevice.StateCallback() { //... }, handler); } catch (CameraAccessException e) { // Handle exception } ``` 5. **显示预览界面**: 创建一个SurfaceView或TextureView用于显示预览,可以自定义UI并与相机预览数据关联。 6. **捕获照片或录制视频**: 可以通过`previewRequestBuilder`构建拍照或录视频的请求,并通过`captureSession`捕捉或开始录制。 请注意,由于隐私和安全原因,某些手机可能会限制应用程序访问特定区域的相机。尽量提供清晰的用途说明给用户,让用户了解为什么要访问他们的相机。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CCPigSnail

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值