android学习整理
【网址:www.javayihao.top】
【布局标签网址:https://www.cnblogs.com/ZSK991656110/p/4815506.html】
【edittext:https://blog.csdn.net/wenzhi20102321/article/details/79477841】
【AlertDialog:https://blog.csdn.net/qq_33990001/article/details/51106617】
【XUI:https://blog.csdn.net/weixin_39253892/article/details/100145339】
【常用:layout_width 宽度、layout_height 高度、layout_padding 内边距、layout_margin 外边距】
【取值:match_parent匹配父容器、wrap_content适应内容、xxdp具体数值,比如200dp】
【android中src和background区别:background会根据ImageView组件给定的长宽进行拉伸,而src就存放的是原图的大小,不会进行拉伸。src是图片内容(前景)可以引外部(地址)图片,bg是背景,可以同时使用。】
【半透明:android:alpha="0~1区间"】
【isEmpty是否初始化,Boolean类型】
【onPause()和onStop()被调用的前提是: 打开了一个新的Activity!而前者是旧Activity还可见的状态;后者是旧Activity已经不可见!AlertDialog和PopWindow是不会触发上述两个回调方法的】
【android:screenOrientation="portrait",就表示当我们切换横竖屏的时候,屏幕的内容始终以竖屏显示,而不会根据屏幕的方向来显示内容
xmlns:tool="http://schemas.android.com/tools"
和tool:ignore="LockedOrientationActivity"来忽略对锁定屏幕的activity的检查。】
【继承Activity和AppCompatActivity后者提供了一些新的东西】
【setDropDownViewResource自定义下拉】
【垂直居中显示Gravity.CENTER】
【切换背景显示ListBox.SetSelected(Int32, Boolean) //Int32选择或清除对其选定的项的从零开始的索引。Boolean如果为 true,则选择指定的项;否则为 false。】
【显示背景图片的holder.mText.setBackgroundResource(R.color.white);】
【xml的eg:<?xml version="1.0" encoding="utf-8" ?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 触摸时并且当前窗口处于交互状态 -->
<item android:state_pressed="true" android:state_window_focused="true" android:drawable= "@drawable/pic1" />
<!-- 触摸时并且没有获得焦点状态 -->
<item android:state_pressed="true" android:state_focused="false" android:drawable="@drawable/pic2" />
<!--选中时的图片背景-->
<item android:state_selected="true" android:drawable="@drawable/pic3" />
<!--获得焦点时的图片背景-->
<item android:state_focused="true" android:drawable="@drawable/pic4" />
<!-- 窗口没有处于交互时的背景图片 -->
<item android:drawable="@drawable/pic5" />
</selector>】
【(刷新)notifyDataSetChanged方法通过一个外部的方法控制如果适配器的内容改变时需要强制调用getView来刷新每个Item的内容。
eg:有时候我们需要修改已经生成的列表,添加或者修改数据,notifyDataSetChanged()可以在修改适配器绑定的数组后,不用重新刷新Activity,通知Activity更新ListView】
【inflate参数:
参数一:layoutID 需要加载的xml中layout资源的ID
参数二:root 需要附加到resource资源文件的根控件,inflate()会返回一个View对象,
如果第三个参数attachToRoot为true,就将这个root作为根对象返回,
否则仅仅将这个root对象的LayoutParams属性附加到resource对象的根布局对象上,
也就是布局文件resource的最外层的View上。如果root为null则会忽略view根对象的LayoutParams属性。
参数三:attachToRoot 是否将root附加到布局文件的根视图上】
【Spinner下拉列表。使用
spinner.setAdapter(adapter);
spinner.setPrompt("下拉菜单");
spinner.setOnItemSelectedListener(new SpinnerOnItemSelectListener());】
【系统自带的条目布局ArrayAdapter adapter = new ArrayAdapter(this,R.layout.item,R.id.TextViewId,list);】
【ButterKnife.bind(this);写了这个就不用再 findViewById这些东西(@Bind(R.id.title) TextView title;)】
【protected void onCreate(Bundle savedInstanceState PersistableBundle persistentState) {}
配置文件中为我们的Activity设置一个属性android:persistableMode="persistAcrossReboots"//持久化
使用:public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState)
1.点击home键回到主页或长按后选择运行其他程序
2.按下电源键关闭屏幕
3.启动新的Activity
4.横竖屏切换时,肯定会执行,因为横竖屏切换的时候会先销毁Act,然后再重新创建 重要原则:
当系统"未经你许可"时销毁了你的activity,则onSaveInstanceState会被系统调用, 这是系统的责任,因为它必须要提供一个机会让你保存你的数据(你可以保存也可以不保存)。
public void onRestoreInstanceState(Bundle savedInstanceState, PersistableBundle persistentState)
和onCreate同样可以从取出前者保存的数据: 一般是在onStart()和onResume()之间执行! 之所以有两个可以获取到保存数据的方法,是为了避免Act跳转而没有关闭, 然后不走onCreate()方法,而你又想取出保存数据】
【Toast.makeText:
*Toast 是一个 View 视图,快速的为用户显示少量的信息。*
1 // 第一个参数:当前的上下文环境。可用getApplicationContext()或this
2 // 第二个参数:要显示的字符串。也可是R.string中字符串ID
3 // 第三个参数:显示的时间长短。Toast默认的有两个LENGTH_LONG(长)和LENGTH_SHORT(短),也可以使用毫秒如2000ms
4 Toast toast=Toast.makeText(getApplicationContext(), "默认的Toast", Toast.LENGTH_SHORT);
5 //显示toast信息
6 toast.show(); 】
【下拉刷新框架SmartRefreshLayout】
【com.scwang.smartrefresh.layout.header.ClassicsHeader指定为经典Header,默认是 贝塞尔雷达Header】
【com.scwang.smartrefresh.layout.header.ClassicsFooter//指定为经典Footer,默认是 BallPulseFooter】
【handler.postDelayed()方法用于intent延迟跳转,定时刷新UI,一般只用于启动页跳转,其他UI页面慎用。】
【Context 概念:Context是一个场景,描述的是一个应用程序环境的信息,即上下文,代表与操作系统的交互的一种过程。】
【loadingManager:show显示/hide隐藏 eg:loadingManager.show("数据加载中,请稍后...");loadingManager.hide(null);】
【Looper:负责管理线程的消息队列和消息循环,如果线程中使用Looper.prepare()和Looper.loop()创建了消息队列就可以让消息处理在该线程中完成。地址:https://blog.csdn.net/heng615975867/article/details/9194219】
【传入后台进行判空:jsonObject!=null? jsonObject.getString("xJ_APPLY_GUID"):""】
****************************************LinearLayout线性布局****************************************
-------------常用属性--------------
排列方式: orientation(vertical竖直,默认horizontal水平)
对齐方式: gravity(bottom底部right右)
对齐(父): layout_gravity(控制该组件在父容器里的对齐方式)
宽: layout_width(wrap_content组件实际大小match_parent填满父容器)
长: layout_height(wrap_content组件实际大小match_parent填满父容器)
ID: id(组件的资源id,可以通过findViewById(id))
背景: background(为组件设置一个背景图片或颜色)
-----------Weight(权重)-----------
等比例划分区域
-----------divider分割线------------
功能:为LinearLayout设置分割图片
用showDivider来设置分割线的位置(none,middle,begining,end)
用法: divider 为LinearLayout设置分割线图片
showDividers 设置分割线所在位置(none,middle,begining,end)
dividerPadding设置分割线的Padding(填充)
*代码部分:*
setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,
LayoutParams.WRAP_CONTENT, 1));
***************************************RelativeLayout相对布局***************************************
【相对布局是通过相对定位的方式让控件出现在布局任意位置;
eg:在相对布局中如果不指定控件摆放的位置,那么控件都会被默认放在RelativeLayout的左上角。
因此要先指定第一个控件的位置,再根据此控件去给其他控件布局。】
-------------常用属性--------------
layout_centerInParent 相对于父容器(取值:true/false)
layout_centerHrizontal 水平居中
layout_centerVertical 垂直居中
layout_centerInparent 相对于父元素完全居中
layout_alignParentBottom 位于父元素的下边缘
layout_alignParentLeft 位于父元素的左边缘
layout_alignParentRight 位于父元素的右边缘
layout_alignParentTop 位于父元素的上边缘
layout_alignWithParentIfMissing 如果对应的兄弟元素找不到的话就以父元素做参照物
*
layout_below 位于元素的下方
layout_above 位于元素的的上方
layout_toLeftOf 位于元素的左边
layout_toRightOf 位于元素的右边
layout_alignTop 该元素的上边缘和某元素的的上边缘对齐
layout_alignLeft 该元素的左边缘和某元素的的左边缘对齐
layout_alignBottom 该元素的下边缘和某元素的的下边缘对齐
layout_alignRight 该元素的右边缘和某元素的的右边缘对齐
******************************************FrameLayout帧布局*****************************************
【后面的子元素直接覆盖在前面的子元素之上,将前面的子元素部分和全部遮挡】
layout_gravity="center"//控件重力
gravity="center"//控件内容相对于控件本身的位置
foreground="@mipmap/bg"//前景
foregroundGravity="center_vetical"//前景重力
****************************************TableLayout表格布局*****************************************
【通过行列的形式展示我们的控件,这样的布局就是表格布局】
stretchColumns="*"//设置可伸展的列,传入的是整型数据,即列的索引,*代表所有,也可多个比如1,2
shrinkColumns="1"//可伸缩的列
collapseColumns="2,3"//隐藏的列
****************************************TableLayout网格布局*****************************************
【网格布局和表格布局类似,但是网格能自身确定整个布局应该出现多少行多少列。控件放入的时候从左到右摆满指定的列数,再从第二行开始摆放】
orientation="horizontal"//表示控件在网格中从左到右顺序摆放还是上到下的顺序摆放
rowCount="4"//行数
columnCount="3"//列数
layout_rowSpan="2"//跨2行
layout_columnSpan="2"//跨2列
layout_gravity="fill"//填充展示
***************************************ConstraintLayout约束布局*************************************
【约束布局更加倾向通过拖拽设计可视化,能够有效解决布局过多问题,让页面更加扁平化】
app:layout_constraintBottom_toBottomOf="@+id/m"//当前控件的下边线约束到到指定控件或者父容器下边线
******************************************Activity介绍**********************************************
onCreate()创建用的
onStart()显示给用户用的[onRestart()]
onResume()@1需要Activity位于前台调用(栈顶)@2如果想让他回到前台,重新获得焦点调用
onPause()当Activity被另一个Activity覆盖调用,保存之前数据
onStop()让前一个Activity不显示调用,停止该Activity
onDestory()在调用过onStop()也可以调用该方法来销毁Activity(此时也是Activity最后一次被调用了)
finish()接上,关闭Activity
%%%显示启动%%%%
1.常见:startActivity(new Intent(当前Act.this,要启动的Act.class));
2.通过Intent的ComponentName:ComponentName cn = new ComponentName("当前Act的全限定类名","启动Act的全限定类名") ;
Intent intent = new Intent() ;
intent.setComponent(cn) ;
startActivity(intent) ;
3.初始化Intent时指定包名:Intent intent = new Intent("android.intent.action.MAIN");
intent.setClassName("当前Act的全限定类名","启动Act的全限定类名");
startActivity(intent);
%%%隐式启动%%%%
【通过Intent-filter的Action,Category或data来实现 这个是通过Intent的 intent-filter**来实现的】
<activity android:name=".SecondActivity"
android:label="第二个Activity">
<intent-filter>
<action android android:name="my_action"/>
<category android:name="mv_category"/>
<category android:name="android.intent.category.DEFAULY"/>*重点*
</intent-filter>
</activity>
JAVA文件中启动:
Intent intent = new Intent() ;
intent.setAction("my_action");
intent.addCategory("my_category");
startActivity(intent);
******************************************Button触发事件********************************************
1.在布局文件中加OnClick=“处理方法名”
JAVA代码中添加public void 处理方法名(属性值 (一般为 View v)){}
eg: public void ImageButtononClick(View view){
Toast.makeText(this, "ImageButtononClick was clicked", Toast.LENGTH_SHORT).show();}
2.在代码中绑定注册监听器,在写一个方法来处理
按钮.setonClivkListener(new OnClickListener(){
public void onClick(View v){事件处理}});
*附:Toast.makeText(类.this,"内容","显示时间长短(Toast.LENGTH_STORT)")
关闭退出整个控件(finish();)
**************************************ImageButton(图片按钮)*****************************************
android:src="图片的路径" //参数值@android:drawable/图片名 这里的drawable是系统提供的资源图片
<?xml version="1.0" encoding="utf-8" ?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 未点击时显示背景 -->
<item android:state_pressed="false"
android:drawable="@drawable/图片名"/>
<!-- 点击时显示背景 -->
<item android:state_pressed="true"
android:drawable="@drawable/图片名"/>
</selector>
**************************************ToggleButton(开关按钮)****************************************
android:disabledAlpha (设置按钮在禁用是的透明度,属性值必须为浮点型)
android:textoff (未选中是按钮的文本) 后台对应方法:setTextOff(字符串)
android:texton (选中时按钮的文本) 后台对应方法:setTextOn(字符串)
****************************************CheckBox(复选按钮)******************************************
布局文件:
<CheckBox 属性 />
<CheckBox 属性 />
<CheckBox 属性 />
后台代码处理:
多选按钮1.setOnCheckedChangeListener(new OnCheckedChangeListener(){
public void onCheckedChanged(CompoundButton buttonView,boolean isChecked){
if(isChecked==true) //如果被选中
{处理结果}
}
});
多选按钮2.setOnCheckedChangeListener(new OnCheckedChangeListener(){
public void onCheckedChanged(CompoundButton buttonView,boolean isChecked){
if(isChecked==true) //如果被选中
{处理结果}
}
});
*************************************EditText(文本框)*********************************************
【xml】
android:inputType="number" 限制输入类型为数字
android:digits="123456789." 可以限制输入的字符(中文或其他字符都可)【不支持区间操作】
【JAVA】
Edittext.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);
【TextWather监听EditText的字符变化】
Edittext et = (EditText) findViewById(R.id.ev_password);
//Edittext有字符变化的回调监听
et.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
String editable = et.getText().toString();//获取Edittext上的字符串
String regEx = "[^a-zA-Z0-9]"; //只能输入字母或数字
Pattern p = Pattern.compile(regEx);
Matcher m = p.matcher(editable);
String str = m.replaceAll("").trim(); //删掉不是字母或数字的字符,其实这里是将不符合要求的替换为""
if(!editable.equals(str)){
et.setText(str); //设置EditText的字符
et.setSelection(str.length()); //因为删除了字符,要重写设置新的光标所在位置
}
}
【通过InputFilter来实现。实现InputFilter过滤器, 需要覆盖一个叫filter的方法。】
EditText et=findViewById(R.id.et);
et.setFilters(new InputFilter[]{
new InputFilter() {
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
String regex = "^[\u4E00-\u9FA5]+$";
boolean isChinese = Pattern.matches(regex, source.toString());
if (!Character.isLetterOrDigit(source.charAt(start)) || isChinese) {
return "";
}
return null;
}
}
});
【字符】
/^(\w|-|[\u4E00-\u9FA5])*$/
^ 以后面的为开头
$ 以前面的为结尾
\w 数字,字母,下划线,.
\u4E00-\u9FA5 中文
* 代表前面出现0次或多次
| 或者
所以整个的意思是匹配一个 数字,字母,下划线,-,.,中文组成的一个字串
上面如果要不能输入1和中文字符,那么这这样写:String regex = "^1|[\u4E00-\u9FA5]+$";//同理你要限制其他字符用“|”即可。
【使用EditText的InputConnection属性限制输入字符。】
*新建个类继承于EditText并覆盖onCreateInputConnection函数, 在xml里使用LimitText替换EditText。*
public class LimitEditText extends EditText {
public LimitEditText(Context context) {
super(context);
}
public LimitEditText(Context context, AttributeSet attrs) {
super(context, attrs);
}
public LimitEditText(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
/**
* 输入法
* @param outAttrs
* @return
*/
@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
return new InnerInputConnecttion(super.onCreateInputConnection(outAttrs),
false);
}
class InnerInputConnecttion extends InputConnectionWrapper implements InputConnection {
public mInputConnecttion(InputConnection target, boolean mutable) {
super(target, mutable);
}
/**
* 对输入的内容进行拦截
*
* @param text
* @param newCursorPosition
* @return
*/
@Override
public boolean commitText(CharSequence text, int newCursorPosition) {
// 只能输入字母或者数字
if (!Character.isLetterOrDigit(charSequence.charAt(i)) || isChinese) {
return false;
}
return super.commitText(text, newCursorPosition);
}
@Override
public boolean sendKeyEvent(KeyEvent event) {
return super.sendKeyEvent(event);
}
@Override
public boolean setSelection(int start, int end) {
return super.setSelection(start, end);
}
}
}
******************************************传递数据*************************************************
【金秋】
public void 方法名(){
String url = CodeConstant.Connector + CodeConstant.SaveVisitTalkInterface;//http://192.168.50.106:9000/xiye-qhwxd-station/app/station/listAllStation(路径)
Map<String, String> headerMap = new HashMap();
paramsMap.put("managerId", String.valueOf(member.getManagerId()));
【提交数据】
XHttp.post(url)
.upJson(JsonUtil.toJson(paramsMap))
.keepJson(true)
.execute(new SimpleCallBack<String>() { @Override
public void onError(ApiException e) {
System.out.println("提交失败");
System.out.println(e);
AlertDialog alertDialogMs = new AlertDialog.Builder(VisItTalkAddActivity.this)
.setTitle("提示:")//标题
.setMessage("提交失败。请联系管理员或重新签到!")//内容
.create();
alertDialogMs.show();
mLoadingDialog.dismiss();//取消加载框
VisItTalkImageUrl="";
VisItTalkVideoUrl="";
}
@Override
public void onSuccess(String response)throws Throwable {
System.out.println("提交成功");
System.out.println("提交成功:"+response);
JSONObject jsonObject = JSONObject.parseObject(response);
if("0".equals(jsonObject.getString("code"))){
AlertDialog alertDialogMs = new AlertDialog.Builder(VisItTalkAddActivity.this)
.setTitle("提示:")//标题
.setMessage("恭喜您!提交成功!")//内容
.create();
alertDialogMs.show();
mLoadingDialog.dismiss();//取消加载框
VisItTalkImageUrl="";
VisItTalkVideoUrl="";
ActivityUtils.startActivity(VisitTalkActivity.class);
finish();
}else{
System.out.println("提交失败:"+jsonObject.getString("msg"));
AlertDialog alertDialogMs = new AlertDialog.Builder(VisItTalkAddActivity.this)
.setTitle("提示:")//标题
.setMessage("提交失败:"+jsonObject.getString("msg")+"。请联系管理员或重新提交!")//内容
.create();
alertDialogMs.show();
mLoadingDialog.dismiss();//取消加载框
VisItTalkImageUrl="";
VisItTalkVideoUrl="";
}
}
});
【获取数据】
XHttp.get(url)
.params(paramsMap)
.keepJson(true)
.execute(new SimpleCallBack<String>() {
@Override
public void onError(ApiException e) {
System.out.println("请求失败requestStatus"+requestStatus);
System.out.println("请求失败");
System.out.println(e);
MemberList=new ArrayList<>();
requestStatus=2;
Message msg = new Message();
if(currPages>1){
Log.i("上拉加载", "请求成功跳转上拉加载");
msg.what = 1;
}else {
Log.i("下拉刷新", "请求成功跳转下拉刷新");
msg.what = 0;
}
Bundle bundle = new Bundle();
bundle.putString("bitmap", "stringBitmap"); //往Bundle中存放图片数据
msg.setData(bundle);//mes利用Bundle传递数据
handler.sendMessage(msg);
AlertDialog alertDialogMs = new AlertDialog.Builder(MemberActivity.this)
.setTitle("提示:")//标题
.setMessage("请求失败!请检查网络或联系管理员!")//内容
.create();
alertDialogMs.show();
}
@Override
public void onSuccess(String response)throws Throwable {
System.out.println("请求成功");
System.out.println("获取成功:"+response);
JSONObject jsonObject = JSONObject.parseObject(response);
if("0".equals(jsonObject.getString("code"))){
requestStatus=1;
JSONObject page = jsonObject.getJSONObject("page");
System.out.println("分页数据:"+page);
totalCount=Integer.valueOf(page.getString("totalCount"));
pageSize=Integer.valueOf(page.getString("pageSize"));
totalPage=Integer.valueOf(page.getString("totalPage"));
currPage=Integer.valueOf(page.getString("currPage"));
JSONArray list = JSONArray.parseArray(page.getString("list"));
System.out.println("请假数据:"+list);
List<Map<String, Object>> visitTalkData =JSONArray.toJavaObject(list, List.class);
System.out.println("请假数据:"+visitTalkData);
if(visitTalkData.size()==0){
requestStatus=3;
}
MemberList=new ArrayList<>();
for (Map<String, Object> map:visitTalkData){
Member member=new Member();
member.setId(Integer.valueOf(String.valueOf(map.get("id"))));
member.setName(String.valueOf(map.get("name")));
MemberList.add(member);}
Message msg = new Message();
if(currPages>1){
Log.i("上拉加载", "请求成功跳转上拉加载");
msg.what = 1;
}else {
Log.i("下拉刷新", "请求成功跳转下拉刷新");
msg.what = 0;
}
Bundle bundle = new Bundle();
bundle.putString("bitmap", "stringBitmap"); //往Bundle中存放图片数据
msg.setData(bundle);//mes利用Bundle传递数据
handler.sendMessage(msg);
}else{
System.out.println("请求失败:"+jsonObject.getString("msg"));
AlertDialog alertDialogMs = new AlertDialog.Builder(MemberActivity.this)
.setTitle("提示:")//标题
.setMessage("请求失败:"+jsonObject.getString("msg")+"。请检查网络或联系管理员!")//内容
.create();
alertDialogMs.show();
}
}
【hgb】
onCreate:
super.onCreate(savedInstanceState);
FinishActivityManager.getManager().addActivity(this);
loadingManager = new LoadingManager(this);
init();
initScreeningView();
//获取所有监测站
String url = ServerUrlUtils.baseURL + "xiye-qhwxd-station/app/station/listAllStation";
System.out.println("URL:"+url);
List<MonitrStation> monitrStations = new ArrayList<>();
Map<String, String> paramsMap = new HashMap();
loadingManager.show("数据加载中...");
OkhttpUtil.okHttpGet(url, paramsMap, new CallBackUtil.CallBackString() {
@Override
public void onFailure(Call call, Exception e) {
loadingManager.hide(null);
System.out.println("请求失败");
System.out.println(e);
System.out.println(call);
}
@Override
public void onResponse(String response) {
System.out.println("请求成功");
System.out.println(response);
JSONObject jsonObject = JSONObject.parseObject(response);
JSONObject jsonResult = jsonObject.getJSONObject("result");
if (jsonResult!=null) {
if (jsonResult.getString("varList") != null&&!"[]".equals(jsonResult.getString("varList"))) {
JSONArray jsonData = JSONArray.parseArray(jsonResult.getString("varList"));
for (int i = 0; i < jsonData.size(); i++) {
JSONObject j = jsonData.getJSONObject(i);
MonitrStation ms=new MonitrStation();
ms.setId(j.getString("GUID"));
monitrStations.add(ms);
listAreaInfos.add(new ConfigTools2.AreaInfo(j.getString("MONITOR_STATION_NAME"),j.getString("GUID"),j.getString("STAT_LG"),j.getString("STAT_LA")));
}
}
}
**********************************BaseAdapter使用教程及方法详解*************************************
【Adapter是什么】
adapter是view和数据的桥梁。在一个ListView或者GridView中,你不可能手动给每一个格子都新建一个view,
所以这时候就需要Adapter的帮忙,它会帮你自动绘制view并且填充数据。
【BaseAdapter是什么】
不会像ArrayAdapter等的封装好的类有那么多局限性,但是这样的话,使用起来自然会更加麻烦一点。
【BaseAdapter怎么用】
在ListView、GridView或者其他的view中,使用setAdapter方法传入我们的baseAdapter就可以用了。
listView.setAdapter(mBaseAdapter);
getCount : 要绑定的条目的数目,比如格子的数量
getItem : 根据一个索引(位置)获得该位置的对象
getItemId : 获取条目的id
getView : 获取该条目要显示的界面(循环下角标,视图,视图组)
*可以简单的理解为,adapter先从getCount里确定数量,然后循环执行getView方法将条目一个一个绘制出来,
所以必须重写的是getCount和getView方法。而getItem和getItemId是调用某些函数才会触发的方法,如果不需要使用可以暂时不修改。
******************************************TextView常用属性******************************************
android:textColor="#000"或者tv.setTextColor(); //颜色
android:textSize="20sp" //大小(建议字体单位为sp,默认情况下,1sp和1dp的大小是一样的。【提示】在Android手机中是可以通过系统设置调整字体的大小,sp会随着手机设置字体的大小变化而变化,而dp不会变。)
android:gravity="center" //对齐方式
android:background="#ccc" //背景
android:autoLink="web" //为TextView中的文字设置链接(all,email,map,none,phone,web)【android:text="http://www.baidu.com"文本要有完整的路径】
android:singleLine="true" //TextView内容只显示单行。对于部分显示···
(android:lines="2" 不管多大都显示两行 //行数属性
android:ellipsize="end" // ①line和maxLine属性要结合ellipsize=“end”使用,多的部分用省略号显示
android:maxLines="2" 超过两行只显示两行 // ②ellipsize省略号显示的位置。start开头,middle中间(貌似只有end对应多行,其他的针对单行)
android:ellipsize="end")
(android:ellipsize="middle" //省略号显示属性【设置middle值时,只针对单行有效,如果设置多行,将没有效果(亲测)】
android:lines="1")
(android:textIsSelectable="true" //文本可选择复制
java:tv_i2=(TextView) findViewById(R.id.tv_i2); 【添加assets文件夹,把字体文件放到文件夹中,在Project视图下查看New->Folder->AssetsFolder】
Typeface fontface=Typeface.createFromAsset(getAssets(),"fonts/fzstk.TTF");【定义一个Typeface,后面把assets下面的完整路径填进去】
tv_i2.setTypeface(fontface);)
android:layout_below //在某元素的下方
android:layout_alignBottom //本元素的下边缘和某元素的的下边缘对齐;
*************************************AlertDialog和AlertDialog.Builder*******************************
【AlertDialog是Dialog的一个直接子类,AlertDialog也是Android系统当中最常用的对话框之一。
一个AlertDialog可以有两个以上的Button,可以对一个AlertDialog设置相应的信息。
比如title,massage,setSingleChoiceItems,setPositiveButton,setNegativeButton等等。。。。】
*使用:AlertDialog.Builder alertDialog =new AlertDialog.Builder(this);&& AlertDialog alertDialogMs = new AlertDialog.Builder(context)*
【关注一个方法setCancelable(false) 该方法定义设置该AlertDialog是否可以被Back键取消,如果不设置默认为true 】
*针对AlertDialog中设置了确定和取消按钮,一般来说确定为执行某个动作,取消就是不执行,但是如果用户点击了系统的Back键,此时就会将AlertDialog关闭,而并没有执行预期的取消的操作。
public class TestsActivity extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);
alertDialog
.setTitle("title")
.setMessage("message")
.setPositiveButton("okBuuon",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
}
})
.setNegativeButton("exitButton",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
}
}).[b]setCancelable(false).[/b]create().show();
}
}
********************************************android.os.Message**************************************
android.os.Message是定义一个Messge包含必要的描述和属性数据,并且此对象可以被发送给android.os.Handler处理。
【属性字段】arg1、arg2、what、obj、replyTo等;
arg1和arg2是用来存放整型数据的;
what是用来保存消息标示的;
obj是Object类型的任意对象;
replyTo是消息管理器,会关联到一个handler,handler就是处理其中的消息。
【通常对Message对象不是直接new出来的,只要调用handler中的obtainMessage方法来直接获得Message对象】
***********************************************Looper***********************************************
android采用消息循环机制来处理线程间的通信,Android消息循环是针对线程的(每个线程都可以有自己的消息队列和消息循环)
,Android系统中Looper负责管理线程的消息队列和消息循环, 可以通过Loop.myLooper()得到当前线程的Looper对象,
通过Loop.getMainLooper()可以获得当前进程的主线程的Looper对象。Looper对象是什么呢?其实Android中每一个Thread都对应一个Looper,
Looper可以帮助Thread维护一个消息队列,负责在多线程之间传递消息的一个循环器。
一个线程可以存在(当然也可以不存在)一个消息队列和一个消息循环(Looper),但是创建的工作线程默认是没有消息循环和消息队列的,
如果想让该线程具有消息队列和消息循环,需要在线程中首先调用Looper.prepare()来创建消息队列,然后调用Looper.loop()进入消息循环。
//创建消息队列 Looper.prepare();
//进入消息循环 Looper.loop();
***********************************Toast.makeText()各个参数都是干嘛的*******************************
【Toast:是一个类,主要管理消息的提示。 】
makeText(aa,bb,cc),是Toast的一个方法,用来显示信息,分别有三个参数。
【aa】this,是上下文参数,指当前页面显示
【bb】“string string string ”是你想要显示的内容,也可以是“你好!”。这个是随便定义的,显示你想要显示的内容。
【cc】Toast.LENGTH_LONG,是你指你提示消息,显示的时间,这个是稍微长点儿,对应的另一个是ToastLENGTH_SHORT,这个时间短点儿,大概2秒钟。
.show()表示显示这个Toast消息提醒,当程序运行到这里的时候,就会显示出来,如果不调用show()方法,这个Toast对象存在,但是并不会显示,所以一定不要忘记。
***************************************LayoutInflater类的inflate方法********************************
【适用于所有需要进行布局填充的场景,是Android中专门进行布局填充的方法】
扩展:View类中的inflate方法内部包裹了LayoutInflater类的inflate方法,这个方法是一个静态方法,不需要创建View类的对象,直接使用
View类名调用,相比上一种方法是一种简便方法。但很明显,这个方法不如上一个方法功能强大。
****************************Android开发BaseAdaper中getView()的三个参数意义**************************
int position位置,一般BaseAdapter都是很多类型一样的数据展示在界面,该属性是判断显示在界面上的是第几个,通过position在BaseAdapter自定义的数组或者集合中取值。并展示在界面上。
View converView 展示在界面上的一个item。因为手机屏幕就那么大,所以一次展示给用户看见的内容是固定的,如果你List中有1000条数据,不应该new1000个converView,
那样内存肯定不足,应该学会控件重用,滑出屏幕的converView就在下面新进来的item中重新使用,只是修改下他展示的值
ViewGroup parent 这个属性是加载xml视图时使用。
inflate(R.layout.adapter__item, parent, false);确定他父控件,减少宽高的测算
***************************************android:inputType 用法大全***********************************
//文本类型,多为大写、小写和数字符号。
android:inputType="none"//输入普通字符
android:inputType="text"//输入普通字符
android:inputType="textCapCharacters"//输入普通字符
android:inputType="textCapWords"//单词首字母大小
android:inputType="textCapSentences"//仅第一个字母大小
android:inputType="textAutoCorrect"//前两个自动完成
android:inputType="textAutoComplete"//前两个自动完成
android:inputType="textMultiLine"//多行输入
android:inputType="textImeMultiLine"//输入法多行(不一定支持)
android:inputType="textNoSuggestions"//不提示
android:inputType="textUri"//URI格式
android:inputType="textEmailAddress"//电子邮件地址格式
android:inputType="textEmailSubject"//邮件主题格式
android:inputType="textShortMessage"//短消息格式
android:inputType="textLongMessage"//长消息格式
android:inputType="textPersonName"//人名格式
android:inputType="textPostalAddress"//邮政格式
android:inputType="textPassword"//密码格式
android:inputType="textVisiblePassword"//密码可见格式
android:inputType="textWebEditText"//作为网页表单的文本格式
android:inputType="textFilter"//文本筛选格式
android:inputType="textPhonetic"//拼音输入格式
//数值类型
android:inputType="number"//数字格式
android:inputType="numberSigned"//有符号数字格式
android:inputType="numberDecimal"//可以带小数点的浮点格式
android:inputType="phone"//拨号键盘
android:inputType="datetime"//日期+时间格式
android:inputType="date"//日期键盘
android:inputType="time"//时间键盘
**********************************************界面之间的跳转****************************************
Intent intent=new Intent(mContext,想要用的Activity.class);
String time = (String) COLLECT_TIME.getText();
intent.putExtra("time",time);
mContext.startActivity(intent);
【想要用的Activity: 】
et.setText(getIntent().getStringExtra("time"));
*************************************************GridView*******************************************
【多行单列,使用listview; 多行多列,使用gridview;】
android:numColumns=”auto_fit” -列数设置为自动
android:columnWidth=”90dp”,-每列的宽度,也就是Item的宽度
android:stretchMode=”columnWidth”-缩放与列宽大小同步
android:verticalSpacing=”10dp”-垂直边距
android:horizontalSpacing=”10dp”-水平边距
*****************************************SimpleAdapter用法和实例************************************
【SimpleAdapter:其实就是数据的适配器,看看它在本实例的构造方】
SimpleAdapter myAdapter = new SimpleAdapter(this ,data,R.layout.simplelayout, new String[]{img,text},new int[]{id_img,id_text});
this:就是Context 实例对象了;
data: 是所有列表的数据,在本例子中是List的实例对象;
R.layout.simplelayout:布局文件,主要就是ImageVeiw 和 TextiView 组件;
new String[]{img,text}:表示布局文件simplelayout.xml里边组件标签android:id属性的值;
new int[]{id_img,id_text}:表示布局文件simplelayout.xml里边组件标签对应的资源ID;
*****************************************项目中需要用到的介绍***************************************
【RecyclerView加载不同view实现效果,支持加载多个view,并且支持用volley获取数据】
初始化视图:
mRV=(RecyclerView) findViewById(R.id.rv_basefragment);
mRV.setLayoutManager(new LinearLayoutManager(this));
//初始化请求队列 queue = Volley.newRequestQueue(this);
//获取网络接口
StringRequest stringRequest=new StringRequest(URL, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
//处理数据
processData(response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
System.out.println(error.getMessage()+"ddddddddddddddddddddddddddddddddddddddddddddd");
}
});
//将请求加入到队列中
queue.add(stringRequest);
//视图绑定
/*
* onBindViewHolder 根据ViewHolder_01获取多个view
* */
@Override
public void onBindViewHolder(BaseViewHolder holder, int position) {
switch (superData.get(position).first){
case COMMUNITY_TOP:
((ViewHolder_01)holder).initData(communityBean);
break;
case COMMUNITY_OHTER:
((ViewHolder_02)holder).initData(superData.get(position));
break;
}
}
/*
* onCreateViewHolder 根据类型绑定多个ViewHolder_01,加载多个不同view
* */
@Override
public BaseViewHolder onCreateViewHolder(ViewGroup arg0, int type) {
switch (type) {
case COMMUNITY_TOP:
return new ViewHolder_01(View.inflate(context, R.layout.item_community_top, null),context);
case COMMUNITY_OHTER:
return new ViewHolder_02(View.inflate(context, R.layout.item_community_other, null),context);
}
return new ViewHolder_02(View.inflate(context, R.layout.item_community_other, null),context);
}
*****************************************Activity之间跳转方法***************************************
【Activity需要进行注册】
Intent intent = new Intent();
intent.putExtra("one", factorOneStr);
intent.putExtra("two", factorTwoStr);
intent.setClass(this, CreatePlaylist.class)
//参数一为当前Package的context,t当前Activity的context就是this,其他Package可能用到createPackageContex()参数二为你要跳转到的Activity的类名
startActivity(intent);
【或者】
//参数:package的上下文对象,通常用this表示当前package的。目标Activity的class对象,不用写全类名
Intent intent=new Intent(this,Main2Activity.class);
startActivity(intent);
【通过Component Name来打开的方式】
Intent intent = new Intent();
intent.setAction(Intent.ACTION_MAIN);
//添加一些特性,具体可以查看Intent文档,相关属性的介绍
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
//通过Bundle向要打开的的Activity传递一些数据
Bundle bundle = new Bundle();
bundle.putString("data", new String(" Hello World"));
intent.putExtras(bundle);
intent.setComponent(new ComponentName( new String("com.android.testActivity"), new String("com.android.testActivity.testActivity")));
startActivity(intent);
【由一个activity 间隔5秒自动跳转到另外一个activity】
(比如说打开一个应用,第一个activity是一个logo图片,显示5秒后跳转到下一个activity)
new Handler().postDelayed(new Runnable() {
public void run() {
Intent mainIntent = new Intent(Welcome.this,
MainActivity.class);
Welcome.this.startActivity(mainIntent);
Welcome.this.finish();
overridePendingTransition(android.R.anim.fade_in,android.R.anim.fade_out);
}
}, 5000);
new Handler().postDelayed(){new Rannable(){
public void run(){
startActivity(new Intent(CurrentActivity.this,TargetActivity.class));
}
},5000
}
*******************************************采集监测日志记录*****************************************
FinishActivityManager.getManager().addActivity(MonitorStationListActivity.this);//返回上一个页面(返回功能)
*************************************ButterKnife与BindView使用详解**********************************
【页面绑定视图(this[页面],view[视图])eg: ButterKnife.bind(this, view);】
使用方法以及注意事项:
在Activity中ButterKnife.bind(this);必须在setContentView();之后,且父类bind绑定后,子类不需要再bind
在Fragment中ButterKnife.bind(this, view);
在Adapter中ButterKnife.bind(this, view);
属性布局不能使用private、static修饰
****************************************RecyclerView 基本用法***************************************
【https://www.jianshu.com/p/b4bb52cdbeb7】