Android 开发学习(三)

news2024/12/23 10:12:16

文章目录

  • 1. ListView 的 使用
  • 2. RecyclerView 的 使用 (推荐)
  • 3. 动画
    • 3.1 逐帧动画
    • 3.2 补间动画
    • 3.2.1 补间动画 之 alpha透明度
    • 3.2.2 补间动画 之 rotate旋转
    • 3.2.3 补间动画 之 scale(缩放)
    • 3.2.3 补间动画 之 translate(平移)
    • 3.3 属性动画
  • 4. 单位 和 尺寸
  • 5. ViewPager 的使用
  • 6. Mvvm 项目架构
  • 7. Fragment 的 基本使用 和 介绍
    • 7.1 Fragment的 产生
    • 7.2 什么是Fragment?
    • 7.3 Fragment的 使用方法

1. ListView 的 使用


示例使用:

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    android:orientation="vertical"
    >

    <ListView
        android:id="@+id/lv"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

MainActivity

package com.example.mydesssc;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private List<Bean> data = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 往data中添加100条数据
        for (int i = 0; i < 100; i++) {
            Bean bean = new Bean();
            bean.setName("学生" + i);
            data.add(bean);
        }

        ListView listView = findViewById(R.id.lv);
        // 通过adapter来配置ListView中的内容
        listView.setAdapter(new MyAdapter(data,this));

        // 可以设置item的点击监听事件
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                Log.e("TAG","setOnItemClickListener被调用");
            }
        });

    }

}

list_item.xml:每一个list的元素布局。

<?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"
    >

    <TextView
        android:id="@+id/tv"
        android:textSize="30dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</LinearLayout>

Bean:存放数据的实体类。

package com.example.mydesssc;

public class Bean {

    String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

MyAdapter:配置listview的adapter。

  • 创建listview的一个自定义adapter只需要继承BaseAdapter就可以。
package com.example.mydesssc;

import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import androidx.recyclerview.widget.RecyclerView;

import java.util.List;

public class MyAdapter extends BaseAdapter {

    private List<Bean> data;

    private Context context;

    public MyAdapter(List<Bean> data, Context context) {
        this.data = data;
        this.context = context;
    }

    // 设置列表长度
    @Override
    public int getCount() {
        // 有多少数据,其实就是长度
        return data.size();
    }

    @Override
    public Object getItem(int i) {
        return null;
    }

    @Override
    public long getItemId(int i) {
        return i;
    }

    // getView方法用来设置每一列的视图。
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        // 创建该类和对象的原因就是为了节省findViewById调用的时间,只需要调用一次存到类中即可。
        ViewHolder viewHolder;

        // 只需要赋值一次就可以了
        if (convertView == null){
            viewHolder = new ViewHolder();
            // 将list_item布局赋值给convertView
            convertView = LayoutInflater.from(context).inflate(R.layout.list_item, parent, false);
            viewHolder.textView = convertView.findViewById(R.id.tv);
            // 设置到convertView视图的tag中
            convertView.setTag(viewHolder);
        } else {
            // 从tag中获取
            viewHolder = (ViewHolder)convertView.getTag();
        }

        // 设置TextView的文本,从data中获取。
        viewHolder.textView.setText(data.get(position).getName());

        Log.e("TAG","经过getView方法");

        // 最后直接返回该视图就可以了。
        return convertView;
    }

    // 可以设置一个类专门存放控件
    private final class ViewHolder{
        TextView textView;
    }

}

效果如下:
在这里插入图片描述

2. RecyclerView 的 使用 (推荐)


RecyclerView比ListView更加灵活,可以设置很多样式。

  • 例如:线性布局、网格布局、交错网格布局(瀑布流)等。

添加RecyclerView的依赖包:

// 添加RecyclerView的依赖包
implementation 'androidx.recyclerview:recyclerview:1.1.0'

在这里插入图片描述


示例代码:

activity_main.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">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/rv"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

recyclerview_item.xml:RecyclerView对象中的item。

<?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"
    >

    <TextView
        android:id="@+id/tv"
        android:textSize="30dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</LinearLayout>

Bean:

package com.example.demo01;

public class Bean {

    String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

**MainActivity: **

  • 注意与adapter的相互操作。
package com.example.demo01;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.StaggeredGridLayoutManager;

import android.nfc.Tag;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    public static final String TAG = "TAG";

    private List<Bean> data = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 创造1000个假数据
        for (int i = 9000; i < 11000; i++) {

            if (i % 4 != 0){
                continue;
            }

            Bean bean = new Bean();
            bean.setName(TAG + i);
            data.add(bean);
        }

        // 获取RecyclerView对象
        RecyclerView recyclerview = findViewById(R.id.rv);

        // 设置RecyclerView的线性布局 , LinearLayoutManager英文直译是线性布局管理器。
        // LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
        // recyclerview.setLayoutManager(linearLayoutManager);

        // 设置RecyclerView的网格布局 , GridLayoutManager英文直译是网格布局管理器。
        // GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 3);
        // recyclerview.setLayoutManager(gridLayoutManager);

        // 设置RecyclerView的交错网格布局(也就是瀑布流方式)
        StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL);
        recyclerview.setLayoutManager(staggeredGridLayoutManager);

        // 设置adapter
        MyAdapter myAdapter = new MyAdapter(data, this);
        recyclerview.setAdapter(myAdapter);

        // RecyclerView本身并没有点击事件。
        // 但是可以在myAdapter中自定义一个点击事件,并且通过匿名对象来设置监听内容。
        myAdapter.setRecyclerItemClickListener(new MyAdapter.OnRecyclerItemClickListener() {
            @Override
            public void onRecyclerItemCLick(int position) {
                Log.e("TAG","onRecyclerItemCLick事件被调用。position:" + position);
            }
        });

    }
}

MyAdapter:适配器配置很重要!!

package com.example.demo01;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import java.util.List;

/**
 * 此处继承RecyclerView的RecyclerView.Adapter,并且还需要配置Holder类泛型,其实就是为了要走holder这种形式。
 * 并且泛型要求必须继承RecyclerView.ViewHolder
 */
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {

    private List<Bean> data;

    private Context context;

    public MyAdapter(List<Bean> data, Context context) {
        this.data = data;
        this.context = context;
    }

    // onCreateViewHolder方法作用:只需要创建RecyclerView的item视图
    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        // 通过View.inflate方法获取到context(也就是传入的this),进而创建出recyclerview_item布局视图对象。
        View view = View.inflate(context,R.layout.recyclerview_item,null);
        // 这样返回一个MyViewHolder对象,并传入view对象即可。
        return new MyViewHolder(view);
    }

    // onBindViewHolder方法作用:绑定数据。
    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
        // holder就是上面创建的holder对象,position就是索引。
        // 这样就可以在这里设置数据了。
        holder.tv.setText(data.get(position).getName());
    }

    // 获取RecyclerView的item个数(也就是总共多少个)。
    @Override
    public int getItemCount() {
        // 为空要设置为0
        return data == null ? 0 : data.size();
    }


    // 上面泛型要求必须继承RecyclerView.ViewHolder
    public class MyViewHolder extends RecyclerView.ViewHolder{

        private TextView tv;

        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
            // 上面函数构造传入的view对象,在这就可以获取操作了。
            tv = itemView.findViewById(R.id.tv);

            // 给itemView布局添加点击事件
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    if (mOnItemClickListener != null){
                        // getAdapterPosition()方法:获取position,可以理解为index索引。
                        mOnItemClickListener.onRecyclerItemCLick(getAdapterPosition());
                    }
                }
            });

        }
    }
    

    // 以下用于映射到点击事件上面,这样外面使用MyAdapter对象的时候,只需要通过匿名对象形式创建赋值mOnItemClickListener,并且自定义事件内容即可。
    private OnRecyclerItemClickListener mOnItemClickListener;

    public void setRecyclerItemClickListener(OnRecyclerItemClickListener listener){
        mOnItemClickListener = listener;
    }

    public interface OnRecyclerItemClickListener{
        void onRecyclerItemCLick(int position);
    }

}

3. 动画


动画类型:逐帧动画(也叫帧动画)、补间动画、属性动画。

3.1 逐帧动画


帧动画的效果就是图片不断的切换,形成的一个动画效果。

animation-list是作为drawable存在的。因此创建的文件必须在drawable下。

drawable的animation-list的定义:
在这里插入图片描述

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout  xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/frame">
    <!-- 将animation-list中的图片设置为背景图片。 -->
</RelativeLayout>

帧动画的启动和停止:
在这里插入图片描述
在这里插入图片描述

3.2 补间动画


补间动画的属性如下:
在这里插入图片描述

3.2.1 补间动画 之 alpha透明度


alpha的透明度动画配置:

  • 创建一个anim目录,在该目录下面创建一个alpha.xml。

alpha.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">

    <alpha
        android:fromAlpha="0"
        android:toAlpha="1"
        android:duration="2000"
        />
    <!-- 从fromAlpha到toAlpha,意思就是从透明变成不透明。所消耗的时间是duration也就是2秒中。 -->

</set>

activity_main.xml:

  • 给imageView图片实现一个从透明显示出来的一个效果。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout  xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:id="@+id/iv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:adjustViewBounds="true"
        android:maxWidth="300dp"
        android:maxHeight="300dp"
        android:src="@drawable/logo"
        />

</RelativeLayout>

MainActivity:

  • 配置动画相关。
package com.example.demo01;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.StaggeredGridLayoutManager;

import android.nfc.Tag;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    public static final String TAG = "TAG";

    private List<Bean> data = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ImageView imageView = findViewById(R.id.iv);
        imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // 相当于根据alpha.xml动画设置文件创建了一个Animation对象
                Animation animation = AnimationUtils.loadAnimation(MainActivity.this, R.anim.alpha);
                // 对imageView开始动画
                imageView.startAnimation(animation);
            }
        });
    }
}

3.2.2 补间动画 之 rotate旋转


与上面相同的一顿操作。只不过配置变成了rotate。

在这里插入图片描述

3.2.3 补间动画 之 scale(缩放)


与上面相同的一顿操作。只不过配置变成了scale。
在这里插入图片描述

3.2.3 补间动画 之 translate(平移)


在这里插入图片描述

3.3 属性动画


属性动画主要依从几个方法。

ValueAnimator方法:针对属性值进行操作。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    // 针对valueAnimator属性值操作
    ValueAnimator valueAnimator = ValueAnimator.ofFloat(0f, 1f);
    valueAnimator.setDuration(2000);
    valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator valueAnimator) {
            float animatedValue = (float) valueAnimator.getAnimatedValue();
            Log.e("itholmes","animatedValue:" + animatedValue);
        }
    });
}

ObjectAnimator方法使用:针对某个object对象(控件对象)操作的动画属性操作。

ImageView imageView = findViewById(R.id.iv);
// 修改imageView的动画的alpha属性
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(imageView, "alpha", 0f, 1f);
objectAnimator.setDuration(4000);
objectAnimator.start();

// 监听方式一:通过Animator.AnimatorListener方式必须都要实现方法。代码有点冗余。
objectAnimator.addListener(new Animator.AnimatorListener() {
    // 动画开始的时候调用
    @Override
    public void onAnimationStart(Animator animator) {

    }
    // 动画结束的时候调用
    @Override
    public void onAnimationEnd(Animator animator) {

    }
    // 动画被取消的时候调用
    @Override
    public void onAnimationCancel(Animator animator) {

    }
    // 动画重复执行的时候调用
    @Override
    public void onAnimationRepeat(Animator animator) {

    }
});

// 监听方式二:通过AnimatorListenerAdapter对象的适配方式来调用也是可以的。而且更加更加方便,只需要重写固定方法即可。
objectAnimator.addListener(new AnimatorListenerAdapter() {
    @Override
    public void onAnimationStart(Animator animation) {
        super.onAnimationStart(animation);
    }
});

注意:不仅仅有ofFloat还有ofInt等等的。

在这里插入图片描述

4. 单位 和 尺寸


px 与 pt的区别:

  • px:pixels(像素)。
  • pt:point 一个标准的长度单位,1pt = 1/72 英寸 ,用于印刷业,非常简单易用。

dp 与 sp的作用:

  • dp:就是dip,device independent pixels(设备独立像素)。不同设备有不同的显示效果,就是在不同的手机上面的显示效果
  • sp:scaled pixels(放大像素),主要用于字体大小设置。显示best for textsize。

LayoutParams相当于一个Layout的信息包,它封装了Layout的位置、高、宽等信息。

// 创建一个LinearLayout对象
LinearLayout linearLayout = new LinearLayout(this);
// 设置一个宽高效果
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 500);
// 方式一:进而给linearLayout对象设置上。
// linearLayout.setLayoutParams(layoutParams);
// 方式二:通过setContentView方法设置主体内容和params的参数。
setContentView(linearLayout,layoutParams);


TextView textView = new TextView(this);
textView.setText("我是文本");
textView.setBackgroundColor(0xffff00);
LinearLayout.LayoutParams textParams = new LinearLayout.LayoutParams(300, 300);

// 方式一:
// textView.setLayoutParams(textParams);
// linearLayout.addView(textView);

// 方式二:
// 可以通过addView方法给textView赋予textParams的参数
linearLayout.addView(textView,textParams);

5. ViewPager 的使用


在这里插入图片描述

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"
    android:orientation="vertical"
    >

    <androidx.viewpager.widget.ViewPager
        android:id="@+id/vp"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

三个layout的页面:

layout1.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    android:orientation="vertical"
     >

    <TextView
        android:text="layout1"
        android:textSize="30sp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

layout2.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    android:background="#ff00ff00"
    android:orientation="vertical"
     >

    <TextView
        android:text="layout2"
        android:textSize="30sp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

layout3.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    android:background="#ffffff00"
    android:orientation="vertical"
     >

    <TextView
        android:text="layout3"
        android:textSize="30sp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

MyAdapter

  • 定义适配器。
package com.example.mynotification;

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

import androidx.annotation.NonNull;
import androidx.viewpager.widget.PagerAdapter;

import java.util.List;

public class MyAdapter extends PagerAdapter {

    private List<View> mListView;

    public MyAdapter(List<View> mListView) {
        this.mListView = mListView;
    }

    @NonNull
    @Override
    public Object instantiateItem(@NonNull ViewGroup container, int position) {
        container.addView(mListView.get(position));
        return mListView.get(position);
    }

    @Override
    public int getCount() {
        return mListView.size();
    }

    @Override
    public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
        // 判断是否相等
        return view == object;
    }

    @Override
    public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
        container.removeView(mListView.get(position));
    }
}

MainActivity

package com.example.mynotification;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.NotificationCompat;
import androidx.viewpager.widget.ViewPager;

import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        LayoutInflater lf = getLayoutInflater().from(this);
        View view1 = lf.inflate(R.layout.layout1, null);
        View view2 = lf.inflate(R.layout.layout2, null);
        View view3 = lf.inflate(R.layout.layout3, null);

        List<View> viewList = new ArrayList<>();
        viewList.add(view1);
        viewList.add(view2);
        viewList.add(view3);

        ViewPager viewPager = findViewById(R.id.vp);
        // 将上面的多个布局赋值给adapter中
        MyAdapter myAdapter = new MyAdapter(viewList);
        // 设置好adapter
        viewPager.setAdapter(myAdapter);


    }
}

6. Mvvm 项目架构


介绍一下MVP架构:

MVP的全称为Model-View-Presenter,Model提供数据,View负责显示,Controller/Presenter负责逻辑的处理。

​—

mvvm架构如下:
在这里插入图片描述

7. Fragment 的 基本使用 和 介绍

7.1 Fragment的 产生


对于平板电脑和手机,fragment都非常实用。
在这里插入图片描述

7.2 什么是Fragment?


fragment是像一个子activity,具备独立的生命周期。

fragment必须委托在activity中才能运行,fragment会随着对应的activity的生命周期开始结束,当然fragment自己也具有独立的开始结束周期。

7.3 Fragment的 使用方法


创建一个Fragment:
在这里插入图片描述
会自动创建一个fragment的类和fragment对应的xml文件。

fragment_blank1.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:orientation="vertical"
    tools:context=".BlankFragment1">

    <TextView
        android:id="@+id/textview"
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:text="@string/hello_blank_fragment" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:text="你好吗"
        android:id="@+id/btn"
        />

</LinearLayout>

BlankFragment1

package com.example.fragmentbase;

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){
        	// 通过inflater来定义好root
            root = inflater.inflate(R.layout.fragment_blank1, container, false);
        }

		// 可以直接通过root来操作fragment里面的内容
        textView = root.findViewById(R.id.textview);
        button = root.findViewById(R.id.btn);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                textView.setText("你好世界!!!!!!");
            }
        });

        return root;
    }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    tools:context=".MainActivity"
    android:orientation="vertical"
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <!-- fragment的name属性来绑定到对应的类。 -->
    <fragment
        android:id="@+id/fragment1"
        android:name="com.example.fragmentbase.BlankFragment1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</LinearLayout>

MainActivity

package com.example.fragmentbase;

import android.os.Bundle;

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2487.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

程序员最浪漫的表白方式,将情书写在她的照片里,Python简直太厉害啦~

人生苦短&#xff0c;我用Python序言实现步骤1、准备工作2、Pillow 介绍3、实战演练序言 这不光棍节快到了&#xff0c;表弟准备写一封情书给他的女神&#xff0c;想在光棍节之前脱单。 为了提高成功率&#xff0c;于是跑来找我给他参谋参谋&#xff0c;本来我是不想理他的&am…

无刷电机控制基础(3)——FOC矢量控制入门

本节我们讲一些无刷电机FOC矢量控制的入门知识。 1&#xff09;FOC矢量控制的作用 我们前两节讲的无刷电机&#xff08;BLDC&#xff09;&#xff0c;是最简单的结构&#xff0c;当转子匀速转动时&#xff0c;定子内产生的反电动势是梯形波&#xff1b;在驱动无刷电机转动时&a…

【大二Web课程设计】基于HTML+CSS技术制作抗疫感动专题网页设计

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

Vue2 带纵向合并的原生表格实现切割侧栏分页

文章目录前言一、目标效果二、失败方案三、正确方案四、解决正确方案中的一个Bug总结前言 前端表格分页. 带纵向合并的表格, 到达固定行数强制分页, 截断本页纵向合并, 在下页展示该纵向列的剩余部分, 代码多为前端数据处理, 所以仅提供思路. 这并不难, 你可以直接看第三节. 一…

嵌入式系统-开关机测试笔记

在嵌入式系统中,产品在出厂前需要对开发板的开关机进行测试,用于验证产品在大量次数的开关机过程中是否出现异常.实现方法如下: 1.电源准备 我们不可能完全人工操作,太耽误时间和效率.在这里我选用了一款稳压源GW INSTEK GPD 3303这款产品支持串口编程控制,花了一些时间编写了…

智能车图像处理去畸变+逆透视教程

逆透视请参考&#xff1a;智能车逆透视教程(含上位机、源码)_LoseHu的博客-CSDN博客 去畸变请参考&#xff1a;智能车去畸变教程(含上位机、源码)_LoseHu的博客-CSDN博客 逆透视去畸变&#xff1a;如下 1.简介 在前两个博文中已经分别说明了单独去畸变、逆透视的方法。为了同…

web前端进阶之一些动画

1.字体图标的基本使用 首先下载iconfont文件夹&#xff0c;用link标签引入&#xff0c;使用如下&#xff1a; <i class"iconfont icon-favorites-fill green"></i> //改样式的话使用iconfont或者使用 .green(自己设置的类名) .iconfont {font-size: 60…

React.memo 和 useMemo 的使用

文章の目录问题背景useMemo 进行优化React.memo 进行优化props的值是基本类型props的值是引用类型写在最后问题背景 大家在使用 React 框架进行开发时一定遇到过以下问题&#xff1a; 当函数式组件中的某一状态改变&#xff0c;整个组件刷新&#xff0c;重新渲染在类组件中 s…

解决虚拟机下 “Linux和Windows之间复制粘贴” 的问题

大家在安装完虚拟机后&#xff0c;其实很多东西都还是要跟Windows打交道的&#xff0c;比如像Linux下某个软件的环境配置&#xff0c;你在Linux下遇到种种问题&#xff0c;这时你已习惯回到Windows下&#xff0c;默默的打开了“一亿名程序员都在用的CSDN平台”&#xff0c;找到…

腾讯疯狂招人,肝完自动化测试这关,20k+妥了

前言 对于程序员来说&#xff0c;BAT 为首的一线互联网公司肯定是自己的心仪对象&#xff0c;毕竟能到这些大厂工作&#xff0c;不仅薪资高待遇好&#xff0c;而且能力技术都能够得到提升&#xff0c;最关键的是还能够给自己镀上一层金&#xff0c;让人瞻仰。 最近很多同行群…

测试开发工程师到底是做什么的?

&#x1f680; 优质资源分享 &#x1f680; 学习路线指引&#xff08;点击解锁&#xff09;知识定位人群定位&#x1f9e1; Python实战微信订餐小程序 &#x1f9e1;进阶级本课程是python flask微信小程序的完美结合&#xff0c;从项目搭建到腾讯云部署上线&#xff0c;打造一…

本地电脑搭建SFTP服务器,并实现公网访问

1. 搭建SFTP服务器 1.1 下载 freesshd 服务器软件 下载地址&#xff1a;freeSSHd and freeFTPd image_1gbuejept12741719ta61ubn8ej9.png-63.1kB 选择freeFTPD.exe下载 下载后&#xff0c;点击安装 image_1gbueks891c258ee2o315kmf9m.png-57.7kB 安装之后&#xff0c;它会提…

Reactor反应器模式

单线程Reactor反应器模式 在事件驱动模式中&#xff0c;当有事件触发时&#xff0c;事件源会将事件dispatch分发到handler处理器进行事件处理。反应器模式中的反应器角色&#xff0c;类似于事件驱动模式中的dispatcher事件分发器角色。 在反应器模式中&#xff0c;有Reactor反…

企业进行高质量数据管理,实施数据治理的关键是什么?

随着数据通过各种方式创造了巨大价值&#xff0c;各领域的企业开始不断挖掘数据的作用&#xff0c;数据的重要性得到了社会各界的共同认可。像我们熟知的数据治理、数据管理、数据标准以及数据资产都是因为数据地位不断提升&#xff0c;企业开始重视起数据全生命周期流程&#…

SpringBoot笔记(一)核心内容

官网&#xff1a;https://spring.io/projects/spring-boot Spring Boot可以轻松创建独立的、基于Spring的生产级应用程序&#xff0c;它可以让你“运行即可”。大多数Spring Boot应用程序只需要少量的Spring配置。 SpringBoot功能&#xff1a; 创建独立的Spring应用程序直接嵌…

2022.11.1 固体物理

Drude Model 原子由原子核和核外电子组成 我们首先看一下不同材料的自由电子密度 知道原子数目基本就知道了核外电子的数目 如果是单位体积内的&#xff0c;知道密度&#xff0c;我们就可以知道质量&#xff0c;根据摩尔质量和阿伏伽德罗常数&#xff0c;我们就可以知道原子…

网络层——IP协议

网络层 网络层概述 网络层主要考虑数据传输的路上问题&#xff0c;在复杂的网络环境中确定一个合适的路径。 网络层设计要尽量简单&#xff0c;向上层只提供简单灵活的、无连接的、不保证可靠性的数据报服务。网络层不提供服务质量的承诺&#xff01; IP 数据报的格式 如何分…

计算机网络---第四章网络层---ipv4---选择题

9# 1IPV4在第一个4B&#xff0c;5678位。当它为0101时&#xff0c;表示首部长度为5420B&#xff0c;这也是最常见的。当它为1111时&#xff0c;表示首部长度为15460B&#xff0c;此时加上了可选字段40B 2协议字段在第三个4B的9到16位&#xff0c;表示IP的上层协议&#xff0c;…

聚观早报 | 吉利汽车拟将极氪独立上市;比亚迪斥资近50亿元造船

今日要闻&#xff1a;吉利汽车拟将极氪独立上市&#xff1b;比亚迪斥资近50亿元造船&#xff1b;华硕开设首个AI智能工厂&#xff1b;升级款Mac将于明年3月推出&#xff1b;世界互联网大会将于11月9日举行吉利汽车拟将极氪独立上市 10 月 31 日消息&#xff0c;吉利汽车午间在港…

个人设计web前端大作业——HTML+CSS华为官网首页

常见网页设计作业题材有 个人、 美食、 公司、 学校、 旅游、 电商、 宠物、 电器、 茶叶、 家居、 酒店、 舞蹈、 动漫、 服装、 体育、 化妆品、 物流、 环保、 书籍、 婚纱、 游戏、 节日、 戒烟、 电影、 摄影、 文化、 家乡、 鲜花、 礼品、 汽车、 其他等网页设计题目, A…