Android实验参考目录

  1. Android生命周期

  2. UI设计-Android计算器

  3. Android UI ListView用法

  4. Intent组件通信

  5. 线程的使用-计时器

  6. 数据的存储与访问sqlite

常用知识点总结

服务绑定bind Service

MathService.java,提供绑定,解绑定,加法的服务

  1. package com.example.pprp.servicebind;
  2. import android.app.Service;
  3. import android.content.Intent;
  4. import android.os.Binder;
  5. import android.os.IBinder;
  6. import android.widget.Toast;
  7. public class MathService extends Service {
  8. private final IBinder mBinder = new LocalBinder();
  9. public class LocalBinder extends Binder
  10. {
  11. MathService getService(){
  12. return MathService.this;
  13. }
  14. }
  15. public MathService() {
  16. }
  17. @Override
  18. public IBinder onBind(Intent intent) {
  19. Toast.makeText(this,"本地邦定:mathservice",Toast.LENGTH_SHORT).show();
  20. return mBinder;
  21. }
  22. @Override
  23. public boolean onUnbind(Intent intent) {
  24. Toast.makeText(this,"取消绑定:mathservice",Toast.LENGTH_SHORT).show();
  25. return false;
  26. }
  27. public long Add(long a, long b)
  28. {
  29. return a+b;
  30. }
  31. }

MainActivity.java

bindService()需要参数:ServiceConnection对象,在ServiceConnection对象中可以获得一个mathService对象。依然用Intent来开启service

  1. package com.example.pprp.servicebind;
  2. import android.content.ComponentName;
  3. import android.content.Context;
  4. import android.content.Intent;
  5. import android.content.ServiceConnection;
  6. import android.os.IBinder;
  7. import android.support.v7.app.AppCompatActivity;
  8. import android.os.Bundle;
  9. import android.view.View;
  10. import android.widget.Button;
  11. import android.widget.TextView;
  12. public class MainActivity extends AppCompatActivity {
  13. private Button btn_bind, btn_unbind,btn_calc;
  14. private TextView tv;
  15. private MathService mathService;
  16. private boolean isBind =false;
  17. private ServiceConnection mCon = new ServiceConnection() {
  18. @Override
  19. public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
  20. mathService = ((MathService.LocalBinder)iBinder).getService();
  21. }
  22. @Override
  23. public void onServiceDisconnected(ComponentName componentName) {
  24. mathService = null;
  25. }
  26. };
  27. @Override
  28. protected void onCreate(Bundle savedInstanceState) {
  29. super.onCreate(savedInstanceState);
  30. setContentView(R.layout.main1);
  31. tv = (TextView)findViewById(R.id.tv);
  32. btn_bind = (Button)findViewById(R.id.btn_bind);
  33. btn_calc = (Button)findViewById(R.id.btn_calc);
  34. btn_unbind = (Button)findViewById(R.id.btn_unbind);
  35. btn_bind.setOnClickListener(new View.OnClickListener() {
  36. @Override
  37. public void onClick(View view) {
  38. if(!isBind)
  39. {
  40. final Intent serviceIntent = new Intent(MainActivity.this,MathService.class);
  41. //startService(serviceIntent);
  42. bindService(serviceIntent,mCon, Context.BIND_AUTO_CREATE);
  43. isBind = true;
  44. }
  45. }
  46. });
  47. btn_calc.setOnClickListener(new View.OnClickListener() {
  48. @Override
  49. public void onClick(View view) {
  50. if(mathService == null)
  51. {
  52. tv.setText("UNBIND!");
  53. return;
  54. }
  55. long a = Math.round(Math.random()*100);
  56. long b = Math.round(Math.random()*100);
  57. long result = mathService.Add(a,b);
  58. String msg = String.valueOf(a)+"+"+String.valueOf(b)+"="+String.valueOf(result);
  59. tv.setText(msg);
  60. }
  61. });
  62. btn_unbind.setOnClickListener(new View.OnClickListener() {
  63. @Override
  64. public void onClick(View view) {
  65. if(isBind)
  66. {
  67. isBind=false;
  68. unbindService(mCon);
  69. mathService=null;
  70. }
  71. }
  72. });
  73. }
  74. }

注册问题:貌似只要是通过new出来的service就不用人工注册了

ThreadService使用总结

MyThreadService.java文件:

构造一个Runnable对象(用于产生随机数),分别在onCreate()中new一个thread,在onStart()中开启thread,在onDestory()中中断thread。

  1. package com.example.pprp.threadtest;
  2. import android.app.Service;
  3. import android.content.Intent;
  4. import android.os.IBinder;
  5. import android.widget.Toast;
  6. public class MyThreadService extends Service {
  7. public MyThreadService() {
  8. }
  9. private Thread workThread;
  10. private Runnable backWork = new Runnable() {
  11. @Override
  12. public void run() {
  13. try{
  14. while(!Thread.interrupted())
  15. {
  16. double randomDouble = Math.random();
  17. MainActivity.UpdateGUI(randomDouble);
  18. Thread.sleep(1000);
  19. }
  20. }catch(InterruptedException e)
  21. {
  22. e.printStackTrace();
  23. }
  24. }
  25. };
  26. @Override
  27. public void onCreate() {
  28. super.onCreate();
  29. Toast.makeText(this,"oncreate()",Toast.LENGTH_SHORT).show();
  30. workThread = new Thread(null,backWork,"workThread");
  31. }
  32. @Override
  33. public void onStart(Intent intent, int startId) {
  34. super.onStart(intent, startId);
  35. Toast.makeText(this,"onstart()",Toast.LENGTH_SHORT).show();
  36. if(!workThread.isAlive())
  37. {
  38. workThread.start();
  39. }
  40. }
  41. @Override
  42. public void onDestroy() {
  43. super.onDestroy();
  44. Toast.makeText(this,"ondestroy()",Toast.LENGTH_SHORT).show();
  45. workThread.interrupt();
  46. }
  47. @Override
  48. public IBinder onBind(Intent intent) {
  49. // TODO: Return the communication channel to the service.
  50. return null;
  51. }
  52. }

MainActivity.java:

创建一个Runnable对象(用来更新线程,必须使用handler),声明静态TextView, new 一个静态Handler, new一个Intent来开启service, 通过button的事件函数触发事件,分别开启服务和关闭服务。

  1. package com.example.pprp.threadtest;
  2. import android.app.Activity;
  3. import android.content.Intent;
  4. import android.os.Handler;
  5. import android.support.v7.app.AppCompatActivity;
  6. import android.os.Bundle;
  7. import android.view.View;
  8. import android.widget.Button;
  9. import android.widget.TextView;
  10. public class MainActivity extends Activity {
  11. static TextView tv;
  12. Button st,ed;
  13. private static double randomDouble;
  14. private static Handler handler = new Handler();
  15. @Override
  16. protected void onCreate(Bundle savedInstanceState) {
  17. super.onCreate(savedInstanceState);
  18. setContentView(R.layout.main1);
  19. tv = (TextView)findViewById(R.id.tv);
  20. st = (Button)findViewById(R.id.btn_start);
  21. ed = (Button)findViewById(R.id.btn_stop);
  22. final Intent serviceIntent = new Intent(this,MyThreadService.class);
  23. st.setOnClickListener(new View.OnClickListener() {
  24. @Override
  25. public void onClick(View view) {
  26. startService(serviceIntent);
  27. }
  28. });
  29. ed.setOnClickListener(new View.OnClickListener() {
  30. @Override
  31. public void onClick(View view) {
  32. stopService(serviceIntent);
  33. }
  34. });
  35. }
  36. public static void UpdateGUI(double refreshDouble)
  37. {
  38. randomDouble = refreshDouble;
  39. handler.post(refreshRunnable);
  40. }
  41. private static Runnable refreshRunnable = new Runnable() {
  42. @Override
  43. public void run() {
  44. tv.setText("output"+String.valueOf(randomDouble));
  45. }
  46. };
  47. }

Service用法总结

new一个service出来:

  1. package com.example.pprp.servicetest;
  2. import android.app.Service;
  3. import android.content.Intent;
  4. import android.os.IBinder;
  5. import android.widget.Toast;
  6. public class MyService extends Service {
  7. public MyService() {
  8. }
  9. @Override
  10. public void onCreate() {
  11. super.onCreate();
  12. Toast.makeText(this,"oncreate()!!",Toast.LENGTH_LONG).show();
  13. }
  14. @Override
  15. public void onStart(Intent intent, int startId) {
  16. super.onStart(intent, startId);
  17. Toast.makeText(this,"onstart()!!",Toast.LENGTH_LONG).show();
  18. double randomDouble = Math.random();
  19. String msg = "RANDOM OUOTPUT :" + String.valueOf(randomDouble);
  20. Toast.makeText(this,msg,Toast.LENGTH_LONG).show();
  21. }
  22. @Override
  23. public IBinder onBind(Intent intent) {
  24. // TODO: Return the communication channel to the service.
  25. return null;
  26. }
  27. @Override
  28. public void onDestroy() {
  29. super.onDestroy();
  30. Toast.makeText(this,"ondestory()!!",Toast.LENGTH_LONG).show();
  31. }
  32. }

注册,修改AndroidManifest.xml文件中的内容

  1. <service
  2. android:name=".MyService"
  3. android:enabled="true"
  4. android:exported="true">
  5. <intent-filter>
  6. <action android:name="com.example.pprp.servicetest"/>
  7. </intent-filter>
  8. </service>

在主Activity中的用法:

  1. package com.example.pprp.servicetest;
  2. import android.content.Intent;
  3. import android.support.v7.app.AppCompatActivity;
  4. import android.os.Bundle;
  5. import android.view.View;
  6. import android.widget.Button;
  7. public class MainA extends AppCompatActivity {
  8. Button st,ed;
  9. @Override
  10. protected void onCreate(Bundle savedInstanceState) {
  11. super.onCreate(savedInstanceState);
  12. setContentView(R.layout.main1);
  13. st = (Button)findViewById(R.id.btn_start);
  14. ed = (Button)findViewById(R.id.btn_stop);
  15. final Intent ServiceIntent = new Intent(this,MyService.class);
  16. st.setOnClickListener(new View.OnClickListener() {
  17. @Override
  18. public void onClick(View view) {
  19. startService(ServiceIntent);
  20. }
  21. });
  22. ed.setOnClickListener(new View.OnClickListener() {
  23. @Override
  24. public void onClick(View view) {
  25. stopService(ServiceIntent);
  26. }
  27. });
  28. }
  29. }

Broadcast Receiver用法

broadcast receiver应该通过new的方式新建,比较好,需要添加几行代码

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.example.pprp.intenttest">
  4. <application
  5. android:allowBackup="true"
  6. android:icon="@mipmap/ic_launcher"
  7. android:label="@string/app_name"
  8. android:roundIcon="@mipmap/ic_launcher_round"
  9. android:supportsRtl="true"
  10. android:theme="@style/AppTheme">
  11. <activity android:name=".MainActivity">
  12. <intent-filter>
  13. <action android:name="android.intent.action.MAIN" />
  14. <category android:name="android.intent.category.LAUNCHER" />
  15. </intent-filter>
  16. </activity>
  17. <activity android:name=".childA" />
  18. <receiver
  19. android:name=".MyReceiver"
  20. android:enabled="true"
  21. android:exported="true">
  22. <intent-filter>
  23. <action android:name="tttesttt"/>
  24. </intent-filter>
  25. </receiver>
  26. </application>
  27. </manifest>

MyReceiver.java

  1. package com.example.pprp.intenttest;
  2. import android.content.BroadcastReceiver;
  3. import android.content.Context;
  4. import android.content.Intent;
  5. import android.widget.Toast;
  6. public class MyReceiver extends BroadcastReceiver {
  7. @Override
  8. public void onReceive(Context context, Intent intent) {
  9. // TODO: This method is called when the BroadcastReceiver is receiving
  10. // an Intent broadcast.
  11. String msg = intent.getStringExtra("key1");
  12. Toast.makeText(context,msg,Toast.LENGTH_SHORT).show();
  13. }
  14. }

onCreate中涉及到的部分:这里tttesttt跟AndroidManifest.xml文件中的一致

  1. String UNIQUE_STRING="tttesttt";
  2. btn_broad.setOnClickListener(new View.OnClickListener() {
  3. @Override
  4. public void onClick(View view) {
  5. Intent intent = new Intent(UNIQUE_STRING);
  6. intent.putExtra("key1","thisis1test");
  7. sendBroadcast(intent);
  8. }
  9. });

Intent使用注意事项

首先,应该使用new Activity的方法来创建子程序,尽量不要手动创建,如果手动创建还需在AndroidManifest.xml文件中添加相应的部分

然后,调用子activity的时候,如果用startActivityForResult,才会有返回值,才能写onActivityResult函数;如果用startAcitivity则不会运行该函数。

1. Intent使用方法

如果发送Intent是:

  1. Uri data = Uri.parse("message string");
  2. Intent intent = new Intent(null,data);
  3. setResult(intent);

那么解析的时候应该是:(父部分的处理)

  1. Uri uridata = data.getData();
  2. tv.setText(uridata.toString());

如果发送Intent是:

  1. Intent intent = new Intent();
  2. intent.putExtra("Name",et.getText().toString());

那么应该用以下方式进行解析:

  1. Uri uridata = data.getData();
  2. tv.setText(uridata.getStringExtra("Name"));

2. 父activity得到子activity的消息

父Activity在btn事件函数中调用子Activity:

  1. Intent intent = new Intent(MainActivity.this,Subsub.class);
  2. startActivityForResult(intent,SUB);

子Activity在btn事件函数中进行Intent发送:

  1. Uri data = Uri.parse(et.getText().toString());
  2. Intent result = new Intent(null,data);
  3. setResult(RESULT_OK,result);
  4. finish();

父Activity中的onActivityResult函数中的内容,用于处理子Activity发送内容

  1. if(requestCode == SUB)
  2. {
  3. if(resultCode == RESULT_OK)
  4. {
  5. Uri uriData = data.getData();
  6. System.out.println("result: " + uriData.toString());
  7. tvs.setText(uriData.toString());
  8. }
  9. }

3. 子activity得到父activity的内容

父activity:

  1. Intent intent = new Intent(MainActivity.this,ChildActivity.class);
  2. intent.putExtra("Name",et.getText().toString());
  3. startActivityForResult(intent,SUBACTIVITY);

子Activity进行接收:

  1. Intent data = getIntent();
  2. tv.setText(data.getStringExtra("Name"));

ListView用法总结

提前需要做的工作:在res目录下new一个menu文件,添加一个Item

主要的用法:

  1. //声明ArrayList, ArrayAdapter
  2. ListView lv;
  3. ArrayList<String> list;
  4. ArrayAdapter<String> adp;
  5. //在onCreate函数中进行如下操作:
  6. lv = (ListView)findViewById(R.id.lv);
  7. list = new ArrayList<String>();
  8. adp = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,list);
  9. lv.setAdapter(adp);
  10. //btn事件函数操作:
  11. String ans = "";
  12. ans += et_cls.getText().toString();
  13. ans += et_stuno.getText().toString();
  14. ans += et_name.getText().toString();
  15. ArrayAdapter temp_adp = (ArrayAdapter) lv.getAdapter();
  16. temp_adp.add(ans);
  17. //listView的事件函数:
  18. lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
  19. @Override
  20. public void onItemClick(AdapterView<?> adapterView, View view, final int pos, long l) {
  21. if(l > 0)
  22. {
  23. System.out.println("test");
  24. PopupMenu popup = new PopupMenu(MainActivity.this,view);
  25. popup.getMenuInflater().inflate(R.menu.del,popup.getMenu());
  26. popup.show();
  27. popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
  28. @Override
  29. public boolean onMenuItemClick(MenuItem item) {
  30. switch(item.getItemId())
  31. {
  32. case R.id.del:
  33. ArrayAdapter temp = (ArrayAdapter)lv.getAdapter();
  34. temp.remove(temp.getItem(pos));
  35. return true;
  36. default:
  37. return false;
  38. }
  39. }
  40. });
  41. }
  42. }
  43. });

完整代码:

  1. btn.setOnClickListener(new View.OnClickListener() {
  2. @Override
  3. public void onClick(View view) {
  4. String msg = et.getText().toString();
  5. ArrayAdapter tp = (ArrayAdapter)lv.getAdapter();
  6. tp.add(msg);
  7. }
  8. });
  9. lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
  10. @Override
  11. public void onItemClick(AdapterView<?> adapterView, View view, final int pos, long l) {
  12. if(l > 0)
  13. {
  14. PopupMenu popup = new PopupMenu(MainActivity.this,view);
  15. popup.getMenuInflater().inflate(R.menu.menu1,popup.getMenu());
  16. popup.show();
  17. popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
  18. @Override
  19. public boolean onMenuItemClick(MenuItem item) {
  20. if(item.getItemId() == R.id.ddelete)
  21. { Toast.makeText(MainActivity.this,"ddlete",Toast.LENGTH_SHORT).show();
  22. ArrayAdapter<String> tmp = (ArrayAdapter)lv.getAdapter();
  23. tmp.remove(tmp.getItem(pos));
  24. }
  25. else if(item.getItemId() == R.id.oopen)
  26. {
  27. Toast.makeText(MainActivity.this,"oopen",Toast.LENGTH_SHORT).show();
  28. }
  29. else if(item.getItemId() == R.id.nnew)
  30. {
  31. Toast.makeText(MainActivity.this,"nnew",Toast.LENGTH_SHORT).show();
  32. }
  33. return false;
  34. }
  35. });
  36. }
  37. }
  38. });

spinner 用法

  1. spn = (Spinner)findViewById(R.id.spinner);
  2. List<String> list = new ArrayList<String>();
  3. list.add(0,"test1");
  4. list.add(1,"test2");
  5. list.add(2,"test3");
  6. ArrayAdapter<String> adp = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item,list);
  7. adp.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
  8. spn.setAdapter(adp);
  9. spn.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
  10. @Override
  11. public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
  12. if(l > 0)
  13. { tv.setText(adapterView.getItemAtPosition(i).toString());
  14. }
  15. }
  16. @Override
  17. public void onNothingSelected(AdapterView<?> adapterView) {
  18. }
  19. });

ArrayAdapter的用法总结

  1. lv = (ListView)findViewById(R.id.lv);
  2. list = new ArrayList<String>();
  3. adp = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,list);
  4. ArrayAdapter tp = (ArrayAdapter)lv.getAdapter();
  5. tp.add("your String");
  6. tp.remove(tp.getItem(pos));

遇到的问题

Installation failed with message Invalid File

这个问题详细报错如下:

  1. Installation failed with message Invalid File:
  2. C:\Android\workspace\Calculator\app\build\intermediates\split-apk\debug\slices\slice_9.apk.
  3. It is possible that this issue is resolved by uninstalling an existing version of the apk if it is present, and then re-installing.

通过谷歌搜索到stackoverflow上的内容:

其中最好的解决方案如下:

  1. Click Build tab ---> Clean Project
  2. Click Build tab ---> Build APK
  3. Run.

亲测有效

版本不匹配导致的gradle编译出错

这时候应该打开GradleScripts目录下的 build.gradle(Module:app),

然后进行修改:

  1. android {
  2. compileSdkVersion 26
  3. buildToolsVersion "27.0.3"
  4. defaultConfig {
  5. applicationId "com.example.administrator.calculator"
  6. minSdkVersion 25
  7. targetSdkVersion 26
  8. versionCode 1
  9. versionName "1.0"
  10. testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
  11. }
  12. buildTypes {
  13. release {
  14. minifyEnabled false
  15. proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
  16. }
  17. }

修改:minSdkVersion 和 compileSdkVersion 等,到你想要的版本

Error:Failed to find target with hash string 'android-26' in: D:\programFile

国内无法访问google的关于android的库,可以选择国内的镜像网站(百度经验中就有),也可以使用VPN(百度搜索android studio VPN)就可以了,

除此以外有时候真的还是要靠运气

需要注意:

版本高的API兼容版本低的API,反之不可行。

  • 模拟器已经打开但是运行时找不到对应的模拟器

找到模拟器的adb文件,如果用的是Android原装adb:

  1. cd C:\Android\sdk\platform-tools
  2. adb connect 127.0.0.1:62001

即可。

如果使用的是夜神模拟器:

  1. cd ../..
  2. cd "Program Files (x86)"/Nox/bin
  3. nox_adb connect 127.0.0.1:62001

即可。

sqlite3 进入运行时遇见报错:

error: no devices/emulators found

解决方案:首先需要明确,必须要先打开模拟器,然后使用哪个模拟器,就要找对应模拟器的adb可执行文件:

如果用的是Android的原装sdk中的模拟器:

  1. cd C:\Android\sdk\platform-tools
  2. adb shell

如果用的是夜神模拟器:

  1. cd "Program Files (x86)"/Nox/bin
  2. nox_adb shell

即可。

sqlite3中进入shell以后,如果遇到以下报错:

mkdir failed for , Read-only file system

可以用以下命令进行解决:

  1. adb shell
  2. mount -o remount rw /

Android Studio快捷键

其他用法

快捷键 说明
Ctrl+D 复制一行
Ctrl+Y 删除当前行
Ctrl+G 快捷定位某行
Ctrl+/ 注释一行
Ctrl+E 查看最近打开的文件
Ctrl+N 查找类名,文件名
Ctrl+O 显示父类中可覆写方法(常用)
Ctrl+F 类内搜索
Ctrl+R 查找替换
Ctrl+J 自动代码(自动提示)
Ctrl+H 显示类的继承结构
Ctrl+W 选中代码,类似双击效果
Ctrl+shift+"+/-" 折叠,展开代码块
Alt+Q 上下文信息
Ctrl+Alt+Shift+f8 临时断电
Ctrl+Shift+J 合并行和文本,例如多行注释,if(){}
Alt+Shift+Up/Down 移动上下行
shift+f6 全局重命名(或者quick fix)

Android 界面设计实用工具

颜色代码

常用颜色搭配

Android常用Theme

Android美化

Android移动软件开发总结的更多相关文章

  1. 【Android 直播软件开发:音视频硬解码篇】

    开篇 炙手可热,望而生畏的音视频开发 时至今日,短视频App可谓是如日中天,一片兴兴向荣.随着短视频的兴起,音视频开发也越来越受到重视,但是由于音视频开发涉及知识面比较广,入门门槛相对较高,让许许多多 ...

  2. 使用Android手机进行开发的尝试

    使用Android手机查看和修改Excel文件.PowerPoint文件并连接幻灯机进行演示等办公方式想必大家已经有所了解.今天介绍一下怎样使用Android进行软件开发. Termux 使用Andr ...

  3. Android软件开发需要学什么

    首先,需要学习哪些Android开发技术? Android的开发技术很多,在开始学习的时候不可能一次性全部学会,也没有必要一开始都全部学会,但是有些技术是非常常用的,需要在开始时打好基础,这些技术时: ...

  4. 如何将Android Studio与华为软件开发云代码仓库无缝对接(二)

    上篇文章:如何将Android Studio与华为软件开发云代码仓库无缝对接(一) 上一章讲了,如何用Android Studio以软件开发云代码仓库为基础,新建一个项目.接下来,这一章继续讲建好项目 ...

  5. 转: Android 软件开发之如何使用Eclipse Debug调试程序详解(七)

    转自: http://www.uml.org.cn/mobiledev/201110092.asp Android 软件开发之如何使用Eclipse Debug调试程序详解(七)   发布于2011- ...

  6. 软件-开发软件:Android Studio

    ylbtech-软件-开发软件:Android Studio Android Studio 是谷歌推出的一个Android集成开发工具,基于IntelliJ IDEA. 类似 Eclipse ADT, ...

  7. 直播软件开发关于Android、iOS中的视频采集步骤

    很多人对直播软件开发还是抱有想法的,但是在这个资本冷静的市场下,直播平台该怎么玩,在直播软件开发过程中哪些功能是必须具备的,这都是值得关注的话题.今天我们给大家分享一份详细的直播软件开发关于Andro ...

  8. 【Android 界面效果18】Android软件开发之常用系统控件界面整理

    [java] view plaincopyprint?   <span style="font-size:18px">1.文本框TextView TextView的作用 ...

  9. Android软件开发之常用系统控件界面整理

    1.文本框TextView TextView的作用是用来显示一个文本框,下面我用两种方式为大家呈现TextView, 第一种是通过xml布局文件呈现 ,第二种是通过代码来呈现,由此可见Android ...

随机推荐

  1. 【BZOJ2938】[Poi2000]病毒 AC自动机+DFS

    [BZOJ2938][Poi2000]病毒 Description 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码 ...

  2. java的list集合操作List<T>转化List<Long>

    java的list集合操作List<T>转化List<Long> package com.google.common.collect; import com.google.co ...

  3. postgresql----TEMPORARY TABLE和UNLOGGED TABLE

    一.TEMPORARY|TEMP TABLE 会话级或事务级的临时表,临时表在会话结束或事物结束自动删除,任何在临时表上创建的索引也会被自动删除.除非用模式修饰的名字引用,否则现有的同名永久表在临时表 ...

  4. 170609、Nginx配置文件详细说明

    在此记录下Nginx服务器nginx.conf的配置文件说明, 部分注释收集与网络. #运行用户 user www-data; #启动进程,通常设置成和cpu的数量相等 worker_processe ...

  5. Oracle管理监控之段空间利用监控-oracle性能优化

    SELECT S.OWNER,       S.SEGMENT_NAME,       S.SEGMENT_TYPE,       S.PARTITION_NAME,       ROUND(BYTE ...

  6. VirtualBox Guest Additions installation

    在使用VirtualBox为CentOS安装增强功能时,输出是: 文本: Verifying archive integrity... All good. Uncompressing VirtualB ...

  7. C++ Design Pattern: What is a Design Pattern?

    Q: What is a Design Pattern? A: Design Patterns represent solutions to problems what arise when deve ...

  8. git学习------> 解决Gitlab 版本升级之后,发送 merge request 出现 http 500 的返回码错误

    今天有同事在Gitlab上发送 Merge Request的时候,直接出现如下所示的界面,提示http 500,服务器内部出错. 一.错误描述 1.1 创建新的 Merge Request 1.2 填 ...

  9. 设置UCHome注册登陆退出的跳转页自定义

    UCHome 默认注册.登录成功后跳转到 http://www.xxx.com/home/space.php?do=home 退出后会跳转到站点的首页,即 http://www.xxx.com/hom ...

  10. centos shell脚本编程1 正则 shell脚本结构 read命令 date命令的用法 shell中的逻辑判断 if 判断文件、目录属性 shell数组简单用法 $( ) 和${ } 和$(( )) 与 sh -n sh -x sh -v 第三十五节课

    centos   shell脚本编程1 正则  shell脚本结构  read命令  date命令的用法  shell中的逻辑判断  if 判断文件.目录属性  shell数组简单用法 $( ) 和$ ...