黑马Android76期学习笔记01基础--day11--fragment、menu菜单,AutoCompleteTextView,缩放、平移补间动画、属性动画、通知

1.fragment入门

都是继承制ViewGroup
1、通过onCreateView这个方法Fragment可以加载自己的布局
2、name属性指向自己定义的fragment:android:name=“com.fengray.ex085.MyFragment”

2.从布局文件中生成fragment

1、布局文件
主布局文件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="horizontal">
    <fragment
        android:name="com.fengray.ex085.MyFragment"
        android:id="@+id/list"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="match_parent"/>
    <fragment
        android:name="com.fengray.ex085.MyFragment2"
        android:id="@+id/viewer"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="match_parent"/>

</LinearLayout>

子布局文件onefragment.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">
    <TextView
        android:textColor="@color/colorPrimary"
        android:text="这是一个Fragment1控件"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</LinearLayout>

子布局文件twofragment.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">
<TextView
    android:textColor="@color/colorPrimary"
    android:text="这是一个Fragment2控件"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>

</LinearLayout>

2、java文件
主activity文件

public class MainActivity extends AppCompatActivity {

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

MyFragment 文件

public class MyFragment extends Fragment {
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        //通过打气筒把一个布局转换成一个View对象
        View view=inflater.inflate(R.layout.onefragment,null);
        return view;
    }
}

MyFragment2 文件

public class MyFragment2 extends Fragment {
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view =inflater.inflate(R.layout.twofragment,null);
        return view;
    }
}
3.动态添加fragment(已过时)

1、获取gragement的管理者
2、开启一个事务
3、提交事务
这里存在一个android包和androidx的包的不用,没有最终实现
1、MainActivity

package com.fengray.myapplication;

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

import android.app.FragmentManager;
import android.os.Bundle;
import android.util.Log;
import android.view.WindowManager;


public class MainActivity extends AppCompatActivity {

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

        //获取手机分辨率
        WindowManager windowManager=(WindowManager)getSystemService(WINDOW_SERVICE);
        //拿到屏幕尺寸
        int windth=windowManager.getDefaultDisplay().getWidth();
        int height=windowManager.getDefaultDisplay().getHeight();

        //判断横竖屏
        //获取Fragment的管理这
        FragmentManager fragmentManager=getFragmentManager();//这似乎没有用上fragmentManger
        //开启事务
        FragmentTransaction beginTransaction= getSupportFragmentManager().beginTransaction();//使用的是androidV4包
        //FragmentTransaction beginTransaction=fragmentManager.beginTransaction();
        if (height>windth){
            Log.d("TAG", "onCreate: 竖屏-----");
            //说明是竖屏,加载一个fragment
            //android.R.id是系统定义好的,使用new FramentSu替换系统的content窗体
            FragmentSu su = new FragmentSu();
            beginTransaction.replace(android.R.id.content,su);

        }else{
            Log.d("TAG", "onCreate: 横屏-----");

            //说明是横屏,加载另一个fragment
            beginTransaction.replace(android.R.id.content,new FragmentHeng());
        }

        //提交事务
        beginTransaction.hashCode();
    }
}

2、FragmentHeng 类

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

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;

public class FragmentHeng extends Fragment {
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view=inflater.inflate(R.layout.heng,null);
        return view;
    }
}

3、FragmentSu

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

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;

public class FragmentSu extends Fragment {

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

        View view=inflater.inflate(R.layout.su,null);
        return view;

    }
}

布局文件
heng.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ImageView
        android:src="@drawable/girls02"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
</LinearLayout>

su.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ImageView
        android:src="@drawable/girls01"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
</LinearLayout>
4.fragment的周期

实际开发中必须要重写onCreateView方法
还可以重写onDestroy方法进行一些回收内存的操作

5.menu菜单

第一种方式声明菜单
创建menu文件夹的main.xml文件,并写入菜单所需要的item

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/action_settings"
        android:orderInCategory="10"
        app:showAsAction="never"
        android:title="设置"/>
    <item
        android:id="@+id/action_settings2"
        android:orderInCategory="11"
        app:showAsAction="never"
        android:title="设置2"/>
</menu>

mainactivity类

import androidx.annotation.LongDef;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;

public class MainActivity extends AppCompatActivity {

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

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        getMenuInflater().inflate(R.menu.main,menu);
        return true;
    }

    //知道具体点击的事哪个菜单条目,重写下面的方法(固定流程)

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()){
            case R.id.action_settings:
                Log.d("TAG", "onOptionsItemSelected: 设置1被选中");
                break;
            case R.id.action_settings2:
                Log.d("TAG", "onOptionsItemSelected: 设置2被选中");
                break;
            default:
                break;
        }
        return true;
    }
}

在这里插入图片描述
第2种方式声明菜单(动态方式,代码方式)

package com.fengray.ex086;

import androidx.annotation.LongDef;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;

public class MainActivity extends AppCompatActivity {

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

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        //第一个参数:分组id,0为不分组
        //二个参数(iteid),第1个条目id,
        //第三个参数是排序,0是默认排序
        //第四个参数是title,字符串
        menu.add(0,1,0,"菜单1111");
        menu.add(0,2,0,"菜单2222");
        menu.add(0,3,0,"菜单3333");

        return true;
    }

    //知道具体点击的事哪个菜单条目,重写下面的方法(固定流程)

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()){
            case 1:
                Log.d("TAG", "onOptionsItemSelected: 菜单1111被选中");
                break;
            case 2:
                Log.d("TAG", "onOptionsItemSelected: 菜单2222被选中");
                break;
            case 3:
                Log.d("TAG", "onOptionsItemSelected: 菜单3333被选中");
                break;
            default:
                break;
        }
        return true;
    }
}

第3种方式弹出一个对话框

package com.fengray.ex086;

import androidx.annotation.LongDef;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;

import android.content.DialogInterface;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    //当菜单打开之前
    @Override
    public boolean onMenuOpened(int featureId, Menu menu) {
        //弹出对话框
        AlertDialog.Builder builder=new AlertDialog.Builder(this);//必须使用this
        builder.setTitle("警告");
        builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Log.d("TAG", "onClick: 点击了确定");
            }
        });
        builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Log.d("TAG", "onClick: 点击了取消");

            }
        });
        builder.show();
        return super.onMenuOpened(featureId, menu);
    }

    //创建菜单
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        //第一个参数:分组id,0为不分组
        //二个参数(iteid),第1个条目id,
        //第三个参数是排序,0是默认排序
        //第四个参数是title,字符串
        menu.add(0,1,0,"菜单1111");
        menu.add(0,2,0,"菜单2222");
        menu.add(0,3,0,"菜单3333");

        return true;
    }

    //知道具体点击的事哪个菜单条目,重写下面的方法(固定流程)

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()){
            case 1:
                Log.d("TAG", "onOptionsItemSelected: 菜单1111被选中");
                break;
            case 2:
                Log.d("TAG", "onOptionsItemSelected: 菜单2222被选中");
                break;
            case 3:
                Log.d("TAG", "onOptionsItemSelected: 菜单3333被选中");
                break;
            default:
                break;
        }
        return true;
    }
}

在这里插入图片描述

6.AutoCompleteTextView(自动完成对话框,实际是自动提示对话框)
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;

public class MainActivity extends AppCompatActivity {
    private AutoCompleteTextView autoCompleteTextView;
    private String [] listString={"釜山行2","侠盗罗宾汉","侠盗","八百壮士守太行","八百","釜山行"};

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

        autoCompleteTextView=findViewById(R.id.act);
        //act这个控件显示数据的院里和listview一样需要一个数据适配器
        ArrayAdapter<String> adapter=new ArrayAdapter<>(getApplication(),R.layout.support_simple_spinner_dropdown_item,listString);
        autoCompleteTextView.setAdapter(adapter);
    }
}

在这里插入图片描述

7.缩放动画
import androidx.appcompat.app.AppCompatActivity;

import android.media.Image;
import android.os.Bundle;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.ScaleAnimation;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.ImageView;

public class MainActivity extends AppCompatActivity {
    private ImageView myimg;

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

        myimg=findViewById(R.id.myimg);

    }

    public void scaleClick(View view){
        ScaleAnimation scaleAnimation=new ScaleAnimation(1.0f,2.0f,1.0f,2.0f, Animation.RELATIVE_TO_SELF,0.5f);
        scaleAnimation.setDuration(2000);//设置动画执行的时间
        scaleAnimation.setRepeatCount(1);//设置动画重复的次数
        scaleAnimation.setRepeatMode(Animation.REVERSE);//设置重复模式
        //开始执行动画
        myimg.startAnimation(scaleAnimation);
    }
}
8.平移动画

动画不会改变控件真实的坐标

import androidx.appcompat.app.AppCompatActivity;

import android.media.Image;
import android.os.Bundle;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.ScaleAnimation;
import android.view.animation.TranslateAnimation;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.ImageView;

public class MainActivity extends AppCompatActivity {
    private ImageView myimg;

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

        myimg=findViewById(R.id.myimg);

    }

    public void scaleClick(View view){
        
        TranslateAnimation TransAnimation=new TranslateAnimation(Animation.RELATIVE_TO_PARENT,0,Animation.RELATIVE_TO_PARENT,0,Animation.RELATIVE_TO_PARENT,0,Animation.RELATIVE_TO_PARENT,0.2f);
        TransAnimation.setDuration(2000);//设置动画执行的时间
        //scaleAnimation.setRepeatCount(1);//设置动画重复的次数
        TransAnimation.setFillAfter(true);//当动画结束,停留在所在的位置上
        TransAnimation.setRepeatMode(Animation.REVERSE);//设置重复模式
        //开始执行动画
        myimg.startAnimation(TransAnimation);
    }
}
9.使用xml的方法定义补间动画

1、在res下创建anim文件夹,加入动画资源文件alpha.xml

<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="2000"
    android:repeatCount="1"
    android:fromAlpha="1.0"
    android:toAlpha="0.0">


</alpha>

2、activity文件

package com.fengray.ex087;

import androidx.appcompat.app.AppCompatActivity;

import android.media.Image;
import android.os.Bundle;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.view.animation.ScaleAnimation;
import android.view.animation.TranslateAnimation;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.ImageView;

public class MainActivity extends AppCompatActivity {
    private ImageView myimg;

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

        myimg=findViewById(R.id.myimg);

    }

    public void scaleClick(View view){
        //使用动画工具类设置动画,透明动画
       Animation animation =AnimationUtils.loadAnimation(getApplicationContext(),R.anim.alpha );

        myimg.startAnimation(animation);
    }
}
10.属性动画

会改变控件的真实坐标

ObjectAnimator不是new出来的,是通过静态方法拿到的

import androidx.appcompat.app.AppCompatActivity;

import android.animation.ObjectAnimator;
import android.media.Image;
import android.os.Bundle;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.view.animation.ScaleAnimation;
import android.view.animation.TranslateAnimation;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.ImageView;

public class MainActivity extends AppCompatActivity {
    private ImageView myimg;

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

        myimg=findViewById(R.id.myimg);

    }

    public void scaleClick(View view){
        //使用动画工具类设置动画,透明动画
        ObjectAnimator objectAnimator=ObjectAnimator.ofFloat(myimg,"TranslationX",10,250,20,100);//产生横向晃动
        //ObjectAnimator objectAnimator=ObjectAnimator.ofFloat(myimg,"scaleX",0.1f,2,1,2);//缩放

        objectAnimator.setDuration(2000);
        objectAnimator.start();
    }
}
15.通知栏介绍(版本问题,未能实现)

具有通知栏性质的组件

  • Toast
  • 对话框
  • 通知栏

能发消息的都有
SmsManager 发送短信
TelephoneManager电话管理者
WindowManager 窗口管理者
NotificationManager 通知管理者

NotificationManager 通知管理器不能直接实例化,只能NotificationManager notificationManager= (NotificationManager) getSystemService(NOTIFICATION_SERVICE);来获取

public class MainActivity extends AppCompatActivity {
    NotificationManager notificationManager;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //获取notificationManager通知管理器的实例
        notificationManager= (NotificationManager) getSystemService(NOTIFICATION_SERVICE);



    }

    //点击发送消息
    @RequiresApi(api = Build.VERSION_CODES.O)
    public void sendClick(View view){

        String id ="channel_1";//channel的id
        String description = "123";//channel的描述信息
        int importance = NotificationManager.IMPORTANCE_LOW;//channel的重要性
        NotificationChannel channel = new NotificationChannel(id, "123", importance);//生成channel

        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.baidu.com"));
        PendingIntent pendingIntent = PendingIntent.getActivity(MainActivity.this,0,intent,0);
        notificationManager.createNotificationChannel(channel);//添加channel

        //创建一个通知常见这,链式调用
        Notification.Builder mBiulder= new Notification.Builder(this);

        mBiulder.setContentTitle("震惊,他居然做出了这样的事情")
        .setContentText("王重阳居然在100岁生日的时候假死,骗取欧阳锋前来夺经,并将欧阳锋的蛤蟆功给废了")
        .setContentIntent(pendingIntent)
        .setSmallIcon(R.drawable.dress111)
        .setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.girl01));

        Notification notification=mBiulder.build();
        //发出通知
        //第一个参数是用来区分通知的,按照数值大小来表示
        notificationManager.notify(10,notification);

    }

    //点击取消发送消息
    public void cancelClick(View view){

    }



}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值