android基础


title: android基础
data: 2022年4月27日19:59:20
tags: 计算机



演示项目地址

https://gitee.com/lixiang856/android_base

1.Android项目结构

image-20220427222153199

Project和Module的基本概念

image-20220427205733389

2.项目打包

image-20220825102309318

image-20220825171005187

3.AVD

​ AVD:android虚拟设备的简称。

​ AVD和模拟器之间的关系:模拟器不包含操作界面,需要借助AVD呈现

​ 创建AVD

image-20220825101030874

​ 选择模拟器型号

image-20220825101111834

​ 选择android版本

image-20220825101123145

4.常用控件

TextView(文本框)
  • id://全局唯一Id
    • findViewById(R.Id.***)//获取控件
  • layout_width://组件宽度
  • layout_height://组件高度
  • text://展示的文本内容
  • textColor://字体颜色
    • #00000000//纯透明
    • #FF000000//不透明
    • #FFFF0000//红色
    • #FF00FF00//绿色
    • #FF0000FF//蓝色
  • textstyle://设置字体风格
  • textSize://字体大小,单位一般为sp
  • background://控件的背景颜色,可为图片
  • gravity://控件内容的对齐方向
    • center|left

阴影效果

  • shadowColor://设置阴影颜色,需搭配shadowRadius一起使用
  • shadowRadius://设置阴影模糊程度,0.1为字体模糊程度,建议3.0
  • shadowDx://设置阴影在水平方向的偏移
  • shadowDy://设置阴影在垂直方向的偏移

跑马灯

  • singleLine://内容单行显示
  • focusable://是否可以获取焦点
  • focusableInTouchMode://在控制视图的触摸模式下是否可以聚焦
  • ellipsize://在哪里省略文本
  • marqueeRepeatLimit://字幕动画重复的次数
  • 标签//获取焦点
Button(按钮)

  • background:@drawable/btn_selector//按钮的背景点击效果

    • <item android:drawable="@drawable/ic_alarm_black_24dp" android:state_pressed="true"/>
      <item android:drawable="@drawable/ic_alarm_off_black_24dp" />
      
  • backgroundTint://按钮的颜色背景点击效果,效果可以与background叠加

  • foreground://前景

  • enabled

事件
  • onClick//点击事件

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button btn = findViewById(R.id.btn);
        //点击事件
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Log.e(TAG,"--------------------onClick");
            }
        });
        //长按事件
        btn.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View view) {
                Log.e(TAG,"------------------onLongClick");
                return false;
            }
        });
        //触摸事件
        btn.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                //motionEvent.getAction() 0,按下;1,弹起;2,移动
                Log.e(TAG,"------------------onTouch+"+motionEvent.getAction());
                //true为消费事件,触摸事件结束后不会继续调用事件;
                //false则继续调用
                return false;
            }
        });
    }
    
    public void onclick(View view) {
        Log.e(TAG,"======================onclick");
    }
    
EditText(输入框)
  • hint输入提示
  • textColorHint提示文字颜色
  • inputType输入类型
  • singleLine单行展示
  • drawableXxxx在输入框的指定方位添加图片
  • paddingXxxx设置内边距
  • background背景色
ImageView(图片框)
  • src 资源路径
  • scaleType 设置图片缩放类型
    • fitStart 保持宽高比缩放图片,直到较场边与组件相等,位于左上角
    • fitEnd 同上,位于右下角
    • fitContent 同上,位于中间
    • fitXY 对图像的横纵进行等比例缩放
    • content 保持原图大小,超出裁剪,位于中心
    • contentCrop 保持宽高比例缩放图片,直到完全覆盖组件,超出部分裁剪
    • contentInside 保持宽高比例缩放图片,直到组件能够完全展示,缺少部分留白
    • matrix 不改变原图大小,从左上角开始绘制,超出部分裁剪
  • maxWidht 最大宽度
  • maxHeight 最大高度
  • adjustViewBounds 调整View的界限
RadioButton(单选按钮)

img

<RadioGroup
    android:id="@+id/rg"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal">


    <RadioButton
        android:id="@+id/btnMan"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:checked="true"
        android:text="" />

    <RadioButton
        android:id="@+id/btnWoman"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="" />
</RadioGroup>

<Button
    android:id="@+id/btn"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="提交"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/rg" />
private TextView man;
private Button button;
private RadioGroup radioGroup;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    man = findViewById(R.id.btnMan);
    button = findViewById(R.id.btn);
    radioGroup = findViewById(R.id.rg);
    radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId) {
                RadioButton radioButton =  findViewById(checkedId);
                Toast.makeText(MainActivity.this,radioButton.getText(), Toast.LENGTH_SHORT).show();
            }
        });

    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            for (int i = 0; i < radioGroup.getChildCount(); i++) {
                RadioButton radioButton = (RadioButton)radioGroup.getChildAt(i);
                if (radioButton.isChecked()) {
                    Toast.makeText(MainActivity.this, "本次提交的是"+radioButton.getText(), Toast.LENGTH_SHORT).show();
                }
            }
        }
    });
}
Checkbox(复选框)

img

private CheckBox man;
private CheckBox woman;
private CheckBox womanAndMan;
private Button button;
private List<String> data = new ArrayList<>();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    man = findViewById(R.id.btnMan);
    woman = findViewById(R.id.btnWoman);
    womanAndMan = findViewById(R.id.btnWomanAndMan);
    button = findViewById(R.id.btn);
    man.setOnCheckedChangeListener(this);
    woman.setOnCheckedChangeListener(this);
    womanAndMan.setOnCheckedChangeListener(this);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            List<String> data = new ArrayList<>();
            if (man.isChecked())data.add(man.getText().toString());
            if (woman.isChecked())data.add(woman.getText().toString());
            if (womanAndMan.isChecked())data.add(womanAndMan.getText().toString());
            Toast.makeText(MainActivity.this, data.toString(), Toast.LENGTH_SHORT).show();
        }
    });
}


@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
    if (compoundButton.isChecked()) Toast.makeText(this, compoundButton.getText(), Toast.LENGTH_SHORT).show();
}
ToggleButton(开关按钮)

img

private ToggleButton toggleButton;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    toggleButton = findViewById(R.id.toggleBtn);
    toggleButton.setOnCheckedChangeListener(this);
}

@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
        Toast.makeText(this,toggleButton.isChecked()?"打开":"关闭" , Toast.LENGTH_SHORT).show();
}
Switch(开关)
private Switch aSwitch;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    aSwitch = findViewById(R.id.aSwitch);
    aSwitch.setOnCheckedChangeListener(this);
}

@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
    Toast.makeText(this, compoundButton.isChecked()?"开":"关", Toast.LENGTH_SHORT).show();
}
  • **android:showText:**设置on/off的时候是否显示文字,boolean
  • **android:splitTrack:**是否设置一个间隙,让滑块与底部图片分隔,boolean
  • **android:switchMinWidth:**设置开关的最小宽度
  • **android:switchPadding:**设置滑块内文字的间隔
  • **android:switchTextAppearance:**设置开关的文字外观,暂时没发现有什么用…
  • **android:textOff:**按钮没有被选中时显示的文字
  • **android:textOn:**按钮被选中时显示的文字
  • **android:textStyle:**文字风格,粗体,斜体写划线那些
  • **android:track:**底部的图片
  • **android:thumb:**滑块的图片
  • android:typeface:设置字体,默认支持这三种:sans, serif, monospace;除此以外还可以使用 其他字体文件(.ttf*),首先要将字体文件保存在assets/fonts/目录下,不过需要在Java代码中设置: Typeface typeFace =Typeface.createFromAsset(getAssets(),“fonts/HandmadeTypewriter.ttf”); textView.setTypeface(typeFace);
SeekBar(拖动条)

img

private SeekBar seekBar;
private TextView textView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    seekBar = findViewById(R.id.seekBar);
    textView = findViewById(R.id.tv);
    seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
            textView.setText("当前进度值:"+i+"/100");
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {
            Toast.makeText(MainActivity.this, "触碰进度条", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
            Toast.makeText(MainActivity.this, "松开进度条", Toast.LENGTH_SHORT).show();
        }
    });
}
ScrollView(滚动条)

img

private Button top_btn;
private Button bottom_btn;
private ScrollView scrollView;
private TextView textView;

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

    textView = findViewById(R.id.tv);
    scrollView = findViewById(R.id.scrollView);
    top_btn = findViewById(R.id.top_btn);
    bottom_btn = findViewById(R.id.bottom_btn);
    StringBuffer sb = new StringBuffer();
    for (int i = 0; i < 100; i++) {
        sb.append(i+"\r\n");
    }
    textView.setText(sb.toString());
    top_btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            scrollView.fullScroll(ScrollView.FOCUS_UP);
        }
    });
    bottom_btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            scrollView.fullScroll(ScrollView.FOCUS_DOWN);
        }
    });

}
其他几种常用对话框基本使用

img

private Button btn1;
private Button btn2;
private Button btn3;
private ProgressDialog pd1 = null;
private ProgressDialog pd2 = null;
private final static int MAXVALUE = 100;
private int progressStart = 0;
private int add = 0;
private Context mContext = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mContext  = MainActivity.this;
    bindViews();
}

private void bindViews() {
    btn1 = findViewById(R.id.btn1);
    btn2 = findViewById(R.id.btn2);
    btn3 = findViewById(R.id.btn3);
    btn1.setOnClickListener(this);
    btn2.setOnClickListener(this);
    btn3.setOnClickListener(this);
}

@Override
public void onClick(View view) {
    switch (view.getId()){
        case R.id.btn1:
            //这里的话参数依次为,上下文,标题,内容,是否显示进度,是否可以用取消按钮关闭
            ProgressDialog.show(MainActivity.this, "资源加载中", "资源加载中,请稍后...",false,true);
            break;
        case R.id.btn2:
            pd1 = new ProgressDialog(mContext);
            pd1.setTitle("软件更新中");
            pd1.setMessage("软件正在更新中,请稍后。。。");
            pd1.setCancelable(true);
            pd1.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            pd1.setIndeterminate(true);
            pd1.show();
            break;
        case R.id.btn3:
            //初始化属性
            progressStart = 0;
            add = 0;
            pd2 = new ProgressDialog(mContext);
            pd2.setMax(MAXVALUE);
            pd2.setTitle("软件更新中");
            pd2.setMessage("软件正在更新中,请稍后。。。");
            pd2.setCancelable(true);
            pd2.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            pd2.setIndeterminate(false);
            pd2.show();
            new Thread(){
                @Override
                public void run() {
                    while (progressStart<MAXVALUE){
                        progressStart=2*usetime();
                        hand.sendEmptyMessage(123);
                    }
                }
            }.start();


    }
}

private int usetime(){
    add++;
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return add;
}

//定义一个用于更新进度的Handler,因为只能由主线程更新界面,所以要用Handler传递信息
final Handler hand = new Handler(){
    @Override
    public void handleMessage(Message msg) {
        //这里的话如果接受到信息码是123
        if(msg.what == 123){
            //设置进度条的当前值
            pd2.setProgress(progressStart);
        }
        //如果当前大于或等于进度条的最大值,调用dismiss()方法关闭对话框
        if(progressStart >= MAXVALUE){
            pd2.dismiss();
        }
    }
};

img

private Button date;
private Button time;

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

    date = findViewById(R.id.date);
    time = findViewById(R.id.time);
    date.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Calendar calendar = Calendar.getInstance();
            new DatePickerDialog(MainActivity.this, new DatePickerDialog.OnDateSetListener() {
                @Override
                public void onDateSet(DatePicker datePicker, int i, int i1, int i2) {
                    Toast.makeText(MainActivity.this, "本次选择的时间是"+i+"年"+(i1+1)+"月"+i2+"日", Toast.LENGTH_SHORT).show();
                }
            },calendar.get(Calendar.YEAR),calendar.get(Calendar.MONTH),calendar.get(Calendar.DAY_OF_MONTH)).show();
        }
    });

    time.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Calendar calendar = Calendar.getInstance();
            new TimePickerDialog(MainActivity.this, new TimePickerDialog.OnTimeSetListener() {
                @Override
                public void onTimeSet(TimePicker timePicker, int i, int i1) {
                    Toast.makeText(MainActivity.this, "本次选择的时间是"+i+"时"+i1+"分", Toast.LENGTH_SHORT).show();
                }
            },calendar.get(Calendar.HOUR_OF_DAY),calendar.get(Calendar.MINUTE),true).show();
        }
    });
}
Menu(菜单)

img

img

private TextView textView;
private TextView textView2;
final private int RED = 110;
final private int YELLOW = 111;
final private int BLUE = 112;
final private int GREEN = 113;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    textView = findViewById(R.id.tv);
    textView2 = findViewById(R.id.tv2);
    registerForContextMenu(textView2);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    menu.add(1,RED,1,"红");
    menu.add(1,YELLOW,2,"黄");
    menu.add(1,BLUE,3,"蓝");
    menu.add(1,GREEN,4,"绿");
    return true;
}

@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
    int itemId = item.getItemId();
    switch (itemId){
        case RED:
            textView.setTextColor(Color.RED);
            break;
        case YELLOW:
            textView.setTextColor(Color.YELLOW);
            break;
        case BLUE:
            textView.setTextColor(Color.BLUE);
            break;
        case GREEN:
            textView.setTextColor(Color.GREEN);
    }
    return super.onOptionsItemSelected(item);
}


//上下文菜单
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
    MenuInflater menuInflater = new MenuInflater(this);
    menuInflater.inflate(R.menu.menu_sub,menu);
    super.onCreateContextMenu(menu, v, menuInfo);
}

@Override
public boolean onContextItemSelected(@NonNull MenuItem item) {
    switch (item.getItemId()){
        case R.id.blue:
            textView2.setTextColor(Color.BLUE);
            break;
        case R.id.red:
            textView2.setTextColor(Color.RED);
            break;
        case R.id.yellow:
            textView2.setTextColor(Color.YELLOW);

    }
    return true;
}

img

ViewPager(视图滑动切换工具

img

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    List<View> list = new ArrayList<>();
    LayoutInflater inflate = getLayoutInflater();
    list.add(inflate.inflate(R.layout.view_one, null, false));
    list.add(inflate.inflate(R.layout.view_two, null, false));
    list.add(inflate.inflate(R.layout.view_three, null, false));
    MyPageAdapter myPageAdapter = new MyPageAdapter(list,Arrays.asList("页面一", "页面二", "页面三"));
    ViewPager viewPager = findViewById(R.id.vp);
    viewPager.setAdapter(myPageAdapter);
}

img

<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:layout_width="match_parent"
        android:layout_height="35dp"
        android:gravity="center"
        android:text="PagerTabStrip效果演示" />

    <androidx.viewpager.widget.ViewPager
        android:id="@+id/vpager_three"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center">

        <androidx.viewpager.widget.PagerTabStrip
            android:id="@+id/pagertitle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="top" />
    </androidx.viewpager.widget.ViewPager>
</LinearLayout>
private ViewPager vpager_three;
private ArrayList<View> aList;
private MyPageAdapter mAdapter;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_three);
    vpager_three = findViewById(R.id.vpager_three);
    aList = new ArrayList<>();
    LayoutInflater li = getLayoutInflater();
    aList.add(li.inflate(R.layout.view_one, null, false));
    aList.add(li.inflate(R.layout.view_two, null, false));
    aList.add(li.inflate(R.layout.view_three, null, false));

    mAdapter = new MyPageAdapter(aList,  Arrays.asList("第一一页", "第二二页", "第三三页"));
    vpager_three.setAdapter(mAdapter);
}
ProgressBar(进度条)
<ProgressBar
    android:id="@+id/progressBar"
    style="@android:style/Widget.ProgressBar.Small"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

<ProgressBar
    android:id="@+id/progressBar3"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/progressBar" />

<ProgressBar
    android:id="@+id/progressBar2"
    style="@android:style/Widget.ProgressBar.Large"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/progressBar3" />

<ProgressBar
    android:id="@+id/progressBar4"
    style="@android:style/Widget.ProgressBar.Horizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:max="100"
    android:progress="50"
    app:layout_constraintTop_toBottomOf="@+id/progressBar2"
    tools:layout_editor_absoluteX="-16dp" />

<ProgressBar
    style="@android:style/Widget.ProgressBar.Horizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:indeterminate="true"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/progressBar4" />
notification(通知)
private NotificationManager manager;
private Notification notification;

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

    //创建通知管理器
    manager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
    if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.O) {
        //创建信道
        NotificationChannel channel = new NotificationChannel("llx", "text",NotificationManager.IMPORTANCE_HIGH);
        manager.createNotificationChannel(channel);
    }

    //创建转跳意图
    Intent intent = new Intent(this, NotificationActivity.class);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
    
    //构建通知
    notification = new NotificationCompat.Builder(this,"llx")
            .setContentTitle("官方通知")
            .setContentText("端午收快递")
            .setColor(Color.parseColor("#FFFF0000"))
            .setSmallIcon(R.drawable.ic_insert_emoticon_black_24dp)
            .setContentIntent(pendingIntent)
            .setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.qwe))
            .setAutoCancel(true)
            .build();
}

public void send(View view) {
    manager.notify(1,notification);
}

public void cancel(View view) {
    manager.cancel(1);
}
AlertDialog(对话框)
public void click(View view) {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("标题")
                .setIcon(R.mipmap.ic_launcher)
                .setMessage("待会买凉皮收快递")
                .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        Toast.makeText(MainActivity.this, "确定", Toast.LENGTH_SHORT).show();
                    }
                })
                .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        Toast.makeText(MainActivity.this, "取消", Toast.LENGTH_SHORT).show();
                    }
                })
                .setNeutralButton("中间", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        Toast.makeText(MainActivity.this, "中间", Toast.LENGTH_SHORT).show();
                    }
                })
                .create();
        builder.show();
    }
PopupWindow(悬浮框)

img

	private PopupWindow popupWindow;
    private Button btn;
    private Button item_btn1;
    private Button item_btn2;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn = findViewById(R.id.btn);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                View v = LayoutInflater.from(MainActivity.this).inflate(R.layout.popup_window, null, false);
                //创建弹窗
                popupWindow = new PopupWindow(v, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT,true);
                //展示弹窗
                popupWindow.showAsDropDown(view,view.getWidth(),-view.getHeight());
                item_btn1 = v.findViewById(R.id.item_btn1);
                item_btn2 = v.findViewById(R.id.item_btn2);
                item_btn1.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        Button btn =(Button) view;
                        Toast.makeText(MainActivity.this, "本次点击的是"+btn.getText(), Toast.LENGTH_SHORT).show();
                    }
                });
                item_btn2.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        Button btn =(Button) view;
                        popupWindow.dismiss();
                        Toast.makeText(MainActivity.this, "本次点击的是"+btn.getText(), Toast.LENGTH_SHORT).show();
                    }
                });
            }
        });
    }
Vibrator(振动器)
<Button
    android:id="@+id/btn_hasVibrator"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="判断是否有振动器" />

<Button
    android:id="@+id/btn_short"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="短振动" />

<Button
    android:id="@+id/btn_long"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="长振动" />

<Button
    android:id="@+id/btn_rhythm"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="节奏振动" />

<Button
    android:id="@+id/btn_cancle"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="取消振动" />
<uses-permission android:name="android.permission.VIBRATE"/>
private Button btn_hasVibrator;
private Button btn_short;
private Button btn_long;
private Button btn_rhythm;
private Button btn_cancle;
private Vibrator myVibrator;
private Context mContext;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    //获得系统的Vibrator实例:
    myVibrator = (Vibrator) getSystemService(Service.VIBRATOR_SERVICE);
    mContext = MainActivity.this;
    bindViews();
}

private void bindViews() {
    btn_hasVibrator =  findViewById(R.id.btn_hasVibrator);
    btn_short =  findViewById(R.id.btn_short);
    btn_long =  findViewById(R.id.btn_long);
    btn_rhythm =  findViewById(R.id.btn_rhythm);
    btn_cancle =  findViewById(R.id.btn_cancle);

    btn_hasVibrator.setOnClickListener(this);
    btn_short.setOnClickListener(this);
    btn_long.setOnClickListener(this);
    btn_rhythm.setOnClickListener(this);
    btn_cancle.setOnClickListener(this);
}


@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.btn_hasVibrator:
            Toast.makeText(mContext, myVibrator.hasVibrator() ? "当前设备有振动器" : "当前设备无振动器",
                    Toast.LENGTH_SHORT).show();
            break;
        case R.id.btn_short:
            myVibrator.cancel();
            myVibrator.vibrate(new long[]{100, 200, 100, 200}, 0);
            Toast.makeText(mContext, "短振动", Toast.LENGTH_SHORT).show();
            break;
        case R.id.btn_long:
            myVibrator.cancel();
            myVibrator.vibrate(new long[]{100, 100, 100, 1000}, 0);
            Toast.makeText(mContext, "长振动", Toast.LENGTH_SHORT).show();
            break;
        case R.id.btn_rhythm:
            myVibrator.cancel();
            myVibrator.vibrate(new long[]{500, 100, 500, 100, 500, 100}, 0);
            Toast.makeText(mContext, "节奏振动", Toast.LENGTH_SHORT).show();
            break;
        case R.id.btn_cancle:
            myVibrator.cancel();
            Toast.makeText(mContext, "取消振动", Toast.LENGTH_SHORT).show();
    }
}

5.动画

  • 逐帧动画:把几张图片快速的播放
  • 补间动画:透明、缩放、旋转和位移效果
  • 属性动画:

6.布局管理器

7.单位和尺寸

px:plxels(像素),比如1440*3040,横着1440个像素点,竖着3040个像素点。一个100X20px的按钮,在不同分辨率的设备上展示的大小是相同的,不会随着分辨率而发生变化。也可称为绝对大小

pt:point,是一个标准的长度单位,1pt=1/72英寸,一般用于印刷业。

dip:device indepent pixels(设备独立像素),不同的设备有不同的展示效果,这个和硬件有关,一般为了支持WVGA,HVGA,QVGA推荐使用

dp:就是dip

sp:scaled pixels(放大像素),主要用于字体显示。

8.fragment

https://developer.android.com/guide/components/fragments.html

img

fragment的特性:

​ 具有自己的生命周期,可以在activity中组合使用多个fragment,可以重复使用一个fragment

必须在activity才能运行,activity暂停,所有的fragment都会暂停,activity销毁,所有的fragment也都会销毁,activity运行,fragment则有自己的生命周期

fragment和activity的区别
  • Fragment 相比较于 Activity 多出 4 个回调周期,在控制操作上更灵活
  • Fragment 可以在 XML 文件中直接进行写入,也可以在 Activity 中动态添加
  • Fragment 可以使用 show()/hide()或者 replace()随时对 Fragment 进行切换,并且切换的时候不会出现明显的效果,用户体验会好;Activity 虽然也可以进行切换,但是 Activity 之间切换会有明显的翻页或者其他的效果,在小部分内容的切换上给用户的感觉不是很好;
<fragment
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:layout_weight="1"
          android:name="com.example.fragment.BlankFragment1"
          android:id="@+id/fragment1"/>

<fragment
          android:layout_width="match_parent"
          android:layout_weight="1"

          android:layout_height="match_parent"
          android:name="com.example.fragment.BlankFragment1"
          android:id="@+id/fragment2"/>
<TextView
    android:layout_width="match_parent"
    android:layout_height="40dp"
    android:id="@+id/tv"
    android:text="@string/hello_blank_fragment" />

<Button
    android:layout_width="match_parent"
    android:layout_height="40dp"
    android:text="how are you?"
    android:id="@+id/btn"/>
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    if (root==null){
        root = inflater.inflate(R.layout.fragment_blank_fragment1, container, false);
    }

    textView = root.findViewById(R.id.tv);
    button = root.findViewById(R.id.btn);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            textView.setText("Yes,I am,and you?");
        }
    });
    return root;
}
动态添加fragment
private void replaceFragment(Fragment fragment) {
    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction transaction = fragmentManager.beginTransaction();
    transaction.replace(R.id.frameLayout,fragment);
    transaction.addToBackStack(null);
    transaction.commit();
}

打开界面

​ onAttach–>onCreate–>onCreateView–>onActivityCreated–>onStart–onResume

退出界面

​ onPause–>onStop

切换fragment

​ onPause–>onStop–>onDestroyView//ui界面替换了,所以view也销毁

重进界面

​ onStart–>onResume

关闭fragment

​ onPause–>onStop–>onDestroyView–>onDestroy–>onDetach

9.Activity

img

数据传递
//发送
Intent intent = new Intent(this, MainActivity2.class);
intent.putExtra("卡拉赞","快跑吧,小姑娘,快跑");
//Bundle的大小是有限制的 < 0.5MB
Bundle bundle = new Bundle();
bundle.putString("买鱼","斗鱼");
bundle.putInt("数量",20);
intent.putExtras(bundle);
startActivity(intent);
//接收
Intent intent = getIntent();
String stringExtra = intent.getStringExtra("卡拉赞");
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append(stringExtra).append("\n");
TextView tv = findViewById(R.id.tv);
Bundle extras = intent.getExtras();
String fish = String.valueOf(extras.get("买鱼"));
String num = String.valueOf(extras.get("数量"));
stringBuffer.append("我今天买了").append(num).append("条").append(fish);
tv.setText(stringBuffer);
后一个传给前一个

img

//发起一个带响应结果的转跳
btn = findViewById(R.id.btnchoose);
btn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent intent = new Intent(MainActivity.this,ImgActivity.class);
        startActivityForResult(intent,1);
    }
});

//接收回调
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode == 1 && resultCode == 2) {
        Bundle bd = data.getExtras();
        int imgid = bd.getInt("imgid");
        //获取布局文件中的ImageView组件
        ImageView img = findViewById(R.id.imgicon);
        img.setImageResource(imgid);
    }
}
//发送
Intent it = getIntent();
Bundle bd = new Bundle();
bd.putInt("imgid",imgs[position]);
it.putExtras(bd);
setResult(2,it);
finish();

11.okhttp

<uses-permission android:name="android.permission.INTERNET"/>
android:usesCleartextTraffic="true"
public class MainActivity extends AppCompatActivity {


    private TextView view;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        view = findViewById(R.id.tv);
    }


    /**
     * 发送get同步请求
     * @param view
     */
    public void getSync(final View view) {
        new Thread(){
            @Override
            public void run() {
                getSyncSend("http://192.168.0.165:8080/demo?a=get同步请求");
            }
        }.start();
        Log.i("--------------","请求完成");
    }


    /**
     * 发送get异步请求
     * @param view
     */
    public void getAsync(View view) {
        getAsyncSend("http://192.168.0.165:8080/demo?a=get异步请求", new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                e.printStackTrace();
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                Log.i("-------------",response.body().string());
            }
        });
        Log.i("--------------","请求完成");

    }


    /**
     * 发送post同步请求
     * @param view
     */
    public void postSync(View view) {
        new Thread(){
            @Override
            public void run() {
                FormBody formBody = new FormBody.Builder().add("a","post同步请求").build();
                postSyncSend("http://192.168.0.165:8080/demo",formBody);
            }
        }.start();

        Log.i("--------------","请求完成");
    }


    /**
     * 发送post异步请求
     * @param view
     * @throws JSONException
     */
    public void postAsync(View view) throws JSONException {
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("a","post异步请求");
        RequestBody requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"),"");
        postAsyncSend("http://192.168.0.165:8080/demo", requestBody, new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {

            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                Log.i("-------------",response.body().string());
            }
        });
        Log.i("--------------","请求完成");
    }

    /**
     * get同步请求使用handler渲染响应数据
     * @param url
     */
    public  void getSyncSend(String url){
        Request build = new Request.Builder().url(url).build();
        OkHttpClient okHttpClient = new OkHttpClient();
        try {
            Response execute = okHttpClient.newCall(build).execute();
            Message message = new Message();
            message.what = 1;
            message.obj = execute.body().string();
            handler.sendMessage(message);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    /**
     * get同步请求
     * @param url
     * @param callback
     */
    public static void getAsyncSend(String url, Callback callback){
        Request build = new Request.Builder().url(url).build();
        OkHttpClient okHttpClient = new OkHttpClient();
        okHttpClient.newCall(build).enqueue(callback);
    }

    /**
     * post同步
     * @param url
     * @param requestBody
     */
    public  void postSyncSend(String url,RequestBody requestBody){
        Request build = new Request.Builder().url(url).post(requestBody).build();
        OkHttpClient okHttpClient = new OkHttpClient();
        try {
            Response execute = okHttpClient.newCall(build).execute();
            Log.i("------------------",execute.body().string());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    /**
     * post异步
     * @param url
     * @param requestBody
     * @param callback
     */
    public static void postAsyncSend(String url, RequestBody requestBody, Callback callback){
        Request build = new Request.Builder().url(url).post(requestBody).build();
        OkHttpClient okHttpClient = new OkHttpClient();
        okHttpClient.newCall(build).enqueue(callback);
    }




    private Handler handler = new Handler(){
        @Override
        public void handleMessage(@NonNull Message msg) {
            switch (msg.what){
                case 1:
                    view.setText(msg.obj.toString());
            }
        }
    };

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值