赞
踩
Android应用程序主要由三部分组成:应用程序描述文件.xml,各种资源文件,应用程序源代码.java。
src——存放Android应用程序中的所有Java源码
AndroidManifest.xml
项目的系统控制文件,每个Android项目必须有这个文件,位于项目根目录下。
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.chapter322_progressbar"> 声明应用程序的包名 <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
res——存放资源文件
drawable目录:存放一些图片资源
layout目录:存放应用程序的布局文件;文件类型为xml,用xml元素来设定屏幕布局;每个xml文件都包含整个或部分屏幕的视图资源。
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout 设置布局样式 xmlns:android="http://schemas.android.com/apk/res/android" xml命名空间声明,每一个android布局文件的最外层标签必须由这个属性 xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <TextView android:id="@+id/textView" 设置控件id并添加到R.java文件中 android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="32dp" android:padding="16dp" android:text="@string/hello" 设置控件文本位strings.xml中的常量hello app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <ProgressBar android:id="@+id/progressBar" style="?android:attr/progressBarStyleHorizontal" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="16dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/textView" /> <Button android:id="@+id/button_hand" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="8dp" android:text="手动增加进度" app:layout_constraintEnd_toStartOf="@+id/progressBar2" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/progressBar" /> </androidx.constraintlayout.widget.ConstraintLayout>
values目录:存放所有xml格式的资源描述文件,例如string.xml, colors.xml, styles.xml, demens.xml(尺寸)和arrys.xml(数组)等描述文件
strings.xml:
<resources> 定义资源的标签
<string name="app_name">chapter322-progressbar</string> 定义字符串常量
</resources>
colors.xml:
<?xml version="1.0" encoding="utf-8"?> 声明xml的版本以及编码方式
<resources>
<color name="colorPrimary">#6200EE</color> 定义颜色资源,颜色值由RGB(三位十六进制数)
<color name="colorPrimaryDark">#3700B3</color> 或RRGGBB(6位十六进制数)表示,以"#"开头
<color name="colorAccent">#03DAC5</color>
</resources>
dimens.xml:
通常用于创建布局常量,在样式和布局资源中定义边界、高度、尺寸、大小等
使用<demen></demen>指定一个维度资源
常用维度定义单位如下:px(像素)、in(英寸)、mm(毫米)、pt(磅):1.72英寸、dip、sp
styles.xml:
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> 定义名称位AppTheme的样式
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
<style name="BaseText">
<item name="android:textSize">14sp</item> 定义字体大小
<item name="android:textColor">#111</item> 定义字体颜色
</style>
</resources>
注意:
res目录文件中的所有文件名只能是“a"“z”,"0"“9”,"_"字符命名,不能包含大写字符,否则会导致错误。
什么是Activity?
AppCompatActivity类
Android生命周期流程图和状态图
其他:
第一个Activity程序(运行结果参照Android应用程序开发教程Android Studio版——100页)
public class MainActivity extends AppCompatActivity { String msg = "Android:"; /** Called when the Activity is firest created. */ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); /** * Activity(活动)通过setContentView方法加载工程res/layout目录下的xml文件,从而调用UI组件。 */ setContentView(R.layout.activity_main); Log.d(msg, "The onCreat() event."); } @Override protected void onStart() { super.onStart(); Log.d(msg, "The onStart() event."); } @Override protected void onResume() { super.onResume(); Log.d(msg, "The onResume() event."); } @Override protected void onPause() { super.onPause(); Log.d(msg, "The onPause() event."); } @Override protected void onStop() { super.onStop(); Log.d(msg, "The onStop() event."); } @Override protected void onDestroy() { super.onDestroy(); Log.d(msg, "The onDestroy() event."); } }
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.app02"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <!-- 一个应用程序可以包含多个Activity(活动),但是每个Activity必须在AndroidManifest.xml配置文件中进行声明。 同时,主Activity还需要用<intent-filter>标签标明为MAIN动作和LAUNCHER类,否则用户无法在手机屏幕上看见应用程序的APP图标。 --> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
布局方式是指一组View元素如何布局,准确地说就是一个ViewGroup中的View如何布局。
Android UI布局一般使用布局管理器、ListView(列表视图)、GridView(网格视图)三种。
用户界面通过View和ViewGroup对象构建;Android中有很多种View和ViewGroup,她们都继承自View类;View对象是Android平台上表示用户界面的基本单元;
FrameLayout
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <!-- 添加剧中显示的安卓图标图片ImageView,将显示在最下层--> <ImageView android:src="@drawable/ic_launcher" android:layout_width="match_parent" android:layout_height="392dp" android:scaleType="fitCenter" android:layout_gravity="center_vertical" /> <!-- 添加居中显示的Frame Demo文字TextView,将显示在最少上层--> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Frame Demo" android:textSize="30px" android:textStyle="bold" android:layout_gravity="left|bottom" android:gravity="center" /> </FrameLayout>
LinearLayout
以单一方向对其中的View对象进行排列显示,垂直排列时屏幕中将只有一列,水平排列时屏幕中将只有一行。
对于多个显示对象,线性布局保持他们之间的间隔以及互相对齐。
TableLayout
RelativeLayout
通过指定View对象相对与其他显示对象或父级对象的相对位置来布局。
进行相对布局时要避免循环依赖。
AbsoluteLayout
ListView以垂直列表形式列出要显示的列表项目。
一般来说,ListView都是和Adapter(适配器)一起使用,数组数据或数据库数据都是通过Adapter把值传递给ListView组件。
实际上,Adapter将数据源中得到的数据传递给AdapterView(适配器视图),AdapterView将数据呈现在Spinner(列表选择框)、ListView(列表视图)、GrideView(网格视图)等UI组件中。
ListView和GrideView是AdapterView的子类。
Adapter的子类:ArraryAdapter(数组适配器)、BaseAdapter(基本适配器)、Cursor Adapter(游标适配器)、SimpleCursorAdapter(简单游标适配器)、SpinnerAdapter(列表适配器)和WrapperListAdapter(封装列表适配器)。
使用方法
示例:
/** * MainActivity.java */ public class MainActivity extends AppCompatActivity { //Array of Strings ... String[] mobileArray = {"Android", "IPhone", "oppo", "vivo", "huawei", "xlinx", "fpga"}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //装配数据,ArrayAdapter<>(this,布局文件:描述的时列表的每一行的布局,数据) ArrayAdapter adapter = new ArrayAdapter<String>(this, R.layout.activity_listview, mobileArray); //通过Id找到ListView列表 ListView listView = (ListView) findViewById(R.id.mobile_list); //将listview和adapter进行绑定 listView.setAdapter(adapter); } }
<!-- activity_main.xml --> <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity"> <ListView android:id="@+id/mobile_list" android:layout_width="match_parent" android:layout_height="wrap_content"> </ListView> </LinearLayout>
布局文件:列表中每行的布局
<!-- activity_listView.xml -->
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/label"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="10dip"
android:textSize="16dip"
android:textStyle="bold"
>
</TextView>
结果:
常用属性
通常使用ImageAdapter(图片适配器)为组件提供数据
示例:
显示图片
ImageAdapter.java
public class ImageAdapter extends BaseAdapter { private Context mContext; //Constructor public ImageAdapter(Context mContext) { this.mContext = mContext; } @Override public int getCount() { return mThumbIds.length; } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { ImageView imageView; if (convertView == null) { imageView = new ImageView(mContext); imageView.setLayoutParams(new GridView.LayoutParams(85, 85)); imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); imageView.setPadding(8, 8, 8, 8); } else { imageView = (ImageView) convertView; } imageView.setImageResource(mThumbIds[position]); return imageView; } //keep all Image in array public Integer[] mThumbIds = { R.drawable.sample1,R.drawable.sample2,R.drawable.sample3, R.drawable.sample1,R.drawable.sample2,R.drawable.sample3, R.drawable.sample1,R.drawable.sample2,R.drawable.sample3 }; }
MainActivity.java
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
GridView gridView = (GridView) findViewById(R.id.gridview);
gridView.setAdapter(new ImageAdapter(this));
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/gridview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:columnWidth="90dp"
android:numColumns="auto_fit"
android:verticalSpacing="10dp"
android:stretchMode="columnWidth"
android:gravity="center"
/>
点击图片全屏显示
TextView(文本框)
EditText(编辑框)
AutoCompleteTextView(自动填充文本)
Button(普通按钮)
ImageButton(图片按钮)
继承自ImageView
功能与Button控件一致。主要区别在于ImageButton中没有text属性,即按钮只显示图片不显示文本。
控件中设置按钮显示图片时可通过android:src属性,代码中动态设置图片使用setImageResource(int)方法来实现。
ImageButton与Button一样都具有背景颜色,为了不影响图片显示,一般设置背景色为透明或者其他图片。
案例设计(用于描述按钮被按下和未按下的两种状态显示的不同的照片)
CheckBox(复选框)
ToggleButton(开关按钮)
RadioButton(单选按钮)与RadioGroup(按钮组)
ImageView(图片)
AnalogClock和DigitalClock
使用进度对话框ProgressDialog类创建ProgressBar(进度条)
Spinner(列表选择框)
TimePicker(时间拾取器)和DatePicker(日期拾取器)
Intent(意图)是一个将要执行操作的抽象描述。
Android的3个核心组件Activity(活动)、Service(服务)和BroadcastReceiver(广播接收器)都需要使用Intent通信。
Intent用于相同或者不同应用程序组件间的后期运行时绑定。
Component(组件)
Action(动作)
一个将被执行的动作的字符串命名,或者对广播意图而言,是发生并报告的动作。这个Intent类定义了一些动作常量,用大写英文单词和下划线组成。
Category(类别)
Data(数据)和Type(类型)
附加信息(Extra)
标志
通过比较Intent对象内容和意图过滤器,找到相匹配的目标组件。
如果一个组件没有任何意图过滤器,那么它只能就收显式意图;一个带过滤器的组件可同时接收显式意图和隐式意图。
点击按钮跳转到第二个Acitvity,并传递相应信息
private void intentToSecond() {
Intent intent1 = new Intent(MainActivity.this, SecondActivity.class);
intent1.putExtra("activitymain", "从AcitvityMain传入");
startActivityForResult(intent1,REQUEST_CODE);
}
第二个Activity中,读取并显示
private void initView() {
String data = null;
Bundle extras = getIntent().getExtras();
if (extras != null) {
data = extras.getString("activitymain");
}
setTitle("现在时在SecondActivity里:"+data);
}
第二个Acitvity中点击按钮,返回第一个Acitvity并传值
private void clickButton() {
Bundle bundle = new Bundle();
bundle.putString("store","来自SecondActivity返回");
Intent intent2 = new Intent();
intent2.putExtras(bundle);
setResult(RESULT_OK, intent2);
finish();
}
从第二个Activity返回到第一个Activity,并显示信息
//在第一个Activity中通过重写onActivityResult()实现 @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CODE) { if (resultCode == RESULT_CANCELED) { setTitle("取消"); } else if (resultCode == RESULT_OK) { String temp = null; Bundle extras = data.getExtras(); if (extras != null) { temp = extras.getString("store"); } setTitle("现在是在ActivityMain里:" + temp); } } }
当Activity实例与用户交互时,会产生一些状态信息:用户选取的值、光标的位置等;
如果此时该Activity进入“暂停”或“停止”状态时,需要保存这些临时状态信息。
响应用户动作的机制就是事件处理
概述:
回调机制实质是将事件的处理绑定在控件上,由图形用户界面控件自己处理事件。
回调不是由该方法的实现方直接调用,而是在特定事件或条件发生时,由另外一方通过一个接口来调用,用于对该事件或条件进行响应。
在Android平台中,每个View都有自己的处理事件的回调方法;当某个事件没有被任何一个View处理时,便会调用Activity中相应的回调方法。
onKeyDoown()
几乎所有View
捕获手机键盘被按下的事件
该方法的接口是KeyEvent.Callback中的抽象方法
public bolean onKeyDown(int keyCode, KeyEvent event)
参数:
keyCode:被按下的键值
event:按键事件的对象,包含事件的详细信息
返回值为true表示已经完整地处理了这个事件,并不希望其他回调方法再一次处理;false表示未完全处理,需要其他回调方法进一步处理,例如Activity中的回调方法。
onKeyUp()
onTouchEvent()
几乎所有View
捕获手机屏幕的触摸的事件
public boolean onTouchEvent(MotionEvet event)
该方法一般情况下会处理三种事件:
屏幕被按下:此时MotionEvent.getAction()
的值为MotionEvent.ACTION_DOWN
屏幕被抬起:此时MotionEvent.getAction()
的值为MotionEvent.ACTION_UP
屏幕被拖动:此时MotionEvent.getAction()
的值为MotionEvent.ACTION_MOVE
onTrackballEvent()
onFocusChanged()
捕获焦点改变事件
只能再View中重写
protected void onFocusChanged(boolean gainFocus, int direction, Rect PreviouslyFocuseRect)
参数:
ginFocus:表示触发该事件的View是否获得了焦点,获得焦点为true,否则为false
direction:表示焦点移动方向,用数值表示
previouslyFocusedRect:表示触发事件的View的坐标系中,前一个获得焦点的矩形区域。如果不可用则为null。
在图形界面中,焦点描述了按键事件的承受者,每次按键事件都发生在拥有焦点的View上。
otionEvent.getAction()的值为
MotionEvent.ACTION_DOWN`
**屏幕被抬起**:此时`MotionEvent.getAction()`的值为`MotionEvent.ACTION_UP`
**屏幕被拖动**:此时`MotionEvent.getAction()`的值为`MotionEvent.ACTION_MOVE`
onTrackballEvent()
onFocusChanged()
捕获焦点改变事件
只能再View中重写
protected void onFocusChanged(boolean gainFocus, int direction, Rect PreviouslyFocuseRect)
参数:
ginFocus:表示触发该事件的View是否获得了焦点,获得焦点为true,否则为false
direction:表示焦点移动方向,用数值表示
previouslyFocusedRect:表示触发事件的View的坐标系中,前一个获得焦点的矩形区域。如果不可用则为null。
在图形界面中,焦点描述了按键事件的承受者,每次按键事件都发生在拥有焦点的View上。
[外链图片转存中…(img-ufIkQwsc-1585896969004)]
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。