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){
}
}