[Consejos en el desarrollo de Android-1]

  1. Si necesita considerar la internacionalización de la aplicación, o la flexibilidad. Se recomienda configurar el contenido del control, android:text="" valor del atributo como un recurso de cadena de referencia (@string/uname). En lugar de asignación directa: "nombre de usuario"

    Si le resulta problemático crear manualmente una cadena, primero puede escribir android:text="registrarse" y luego [Ctrl+1] en la cadena "registrarse", seleccione Extraer cadena de Android (Extraer cadena de Android)

     提取后,会自动在 strings.xml文件中 添加字符串子项,且布局文件中也会引用该字符串。最后 project->clean :就会发现黄色警告消失!
    
  2. Si hay varios botones en el mismo diseño, el sistema utilizará de forma predeterminada la barra de botones, pero aún se mostrará como un botón normal:

    -----Eclipse emitirá una advertencia sobre esto: los botones en las barras de botones no deben tener bordes use style="?android:attr/buttonBarButtonStyle" (y ?an…;

     因此需要设置按钮的 style="?Android:attr/buttonBarButtonStyle"。从而实现真正的 [无边界的按钮栏] 	
    
  3. En el programa de Android: 1. Dado que Android se desarrolla actualmente con Java, se puede usar alguna lógica de verificación de procesamiento de cadenas de Java.

     	        2.也可以使用android提供的 TextUtils类,进行一些字符串的处理。例如:TextUtils.isEmpty(userName);判断用户名是否为空
    

4. [XXXActivity.this se puede usar a menudo en el programa para representar la referencia del objeto Activity actual. Para simplificar el código puedes:

	 	 1.先定义一个 private Context thisContext ; // 成员变量

	 	 2.在 onCreate 方法中 对它进行初始化: thisContext = this; //赋值  ,这样就方便了。

	 	 			    	//MainActivity.this
	例如:Toast.makeText(thisContext, "登录成功!\n 欢迎"+userName+"!", Toast.LENGTH_SHORT).show();

]

  1. A veces, si necesita definir una clase y definir algunos métodos. Entonces puedes escribir directamente:

    UserInfoUtils.saveUserInfo(userName,pwd);
    
    在报错的地方,Ctrl+F1 然后选择创建类,创建方法
    

6. [Cada aplicación debe tener un directorio privado en la ROM: (datos/datos/nombre del paquete/archivos)]

Hay dos formas de obtener (usar):
 1.
context.getFileDir().getPath(); // O obtenga el directorio privado de la aplicación actual (datos/datos/nombre del paquete/archivos) (ruta) – ROM //contexto como: MainActivity.this
.
 2.
context.openFileIn(Out)put(name,mode) — obtener el flujo de entrada/salida del archivo del directorio privado de la aplicación actual (datos/datos/nombre del paquete/archivos)]

 //【context 可以是 Activity.this  ,Service.this 】
  1. En el archivo de diseño xml: se recomienda utilizar dp (píxeles independientes del dispositivo) para la longitud y (sp) para el tamaño de fuente porque sp puede ajustar el tamaño de fuente.

  2. ----------------【Obtenga la identificación del archivo de recursos del control en el código lógico】---------------

    Ejemplo: imgView.setBackgroundResource(R.drawable.j); //【Establecer su imagen de fondo】

     imgView.setTag(R.drawable.j); 		 			//【 设置ImageView的 Tag标志信息 为 ImageView的 图片资源id 】
    
     //在其他代码中就可以 :通过 img.getTag();来获取前期用 Tag 保存的 资源文件id
    
     int userClickImgBG_id = (Integer) imgView.getTag(); //【获得ImageView 的图片资源文件的id	】
    

    //Consejos:
    imgView.setBackgroundResource(0); //Puedes eliminar la imagen de fondo

  3. Obtenga el ancho y el alto (resolución) de la pantalla del teléfono móvil: (método 1)

      获取WindowManager有两种方式:1: WindowManager wm = this.getSystemService(WINDOW_SERVICE);
     				 	      2: WindowManager wm =  this.getWindowManager();
    
    
     Display display = this.getWindowManager().getDefaultDisplay();	//获得默认(本地)的显示设备
     screen_width = display.getWidth();  
     screen_width = display.getHeight();  // 两个函数已经过时!,但最好用
    

    Obtenga el ancho y el alto (resolución) de la pantalla del teléfono móvil: (Método 2) ---------------【Uso recomendado】-----------------

     DisplayMetrics dm = new DisplayMetrics();//屏幕度量
     getWindowManager().getDefaultDisplay().getMetrics(dm);
     screen_width = dm.widthPixels;//宽度
     screen_height = dm.heightPixels ;//高度
    

  4. -----[Cambiar el nombre del paquete del proyecto (aplicación)]----

    [En el proyecto de Android, haga clic con el botón derecho en "Herramientas de Android —> Cambiar el nombre del paquete de la aplicación"]

  5. -----------【Eliminar la barra de título y la barra de estado (pantalla completa)】------------------

    // [Estas dos líneas de código deben escribirse antes de setContentView();]

    //去除title   
    requestWindowFeature(Window.FEATURE_NO_TITLE);   
    
    //去掉Activity上面的状态栏---【也就会全屏】
    getWindow().setFlags(WindowManager.LayoutParams. FLAG_FULLSCREEN , WindowManager.LayoutParams. FLAG_FULLSCREEN);  
    

    Nota:
    En el estado de pantalla completa, siempre que Activit reescriba el método onCreateOptionsMenu();, también puede hacer clic en el botón de opción para abrir el cuadro de diálogo


    Apéndice: [Eliminar la barra de título de todas las páginas de la aplicación]: en el archivo de manifiesto, establezca el atributo android:theme debajo del nodo de la aplicación en: @android:style/Theme.NoTitleBar, luego se eliminará cada Actividad en toda la aplicación la barra de título.

    也可以单独设置去掉某个Activity的标题栏只需在 activity结点下设置 android:theme属性为:@android:style/Theme.NoTitleBar即可	
    
  6. ---------------【Configure la pantalla de actividad para forzar la pantalla horizontal o forzar la pantalla vertical:】-------------------

[Porque cambiar entre pantallas horizontales y verticales hará que la actividad se destruya y luego se vuelva a crear. Hay tres formas de tratarlo:

	方式1.【在onCreate方法中 强制为横屏或竖屏】---详见下文------------[但并不推荐]

	方式2.【在清单文件中设置Activity的屏幕方向属性为强制横屏或竖屏】---详见下文---------[不够灵活]
						
	方式3.【在清单文件中为Activity属性 android:configChanges="orientation|keyboardHidden|screenSize"】-----【最佳方式】

	
1.【AndroidManifest.xml文件中设置Activity的屏幕方向属性为强制横屏或竖屏】

			<activity android:name=".MainActivity"
				      android:screenOrientation="landscape/[portrait]"/>

2.【onCreate方法中 强制为横屏或竖屏】
		setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
							  //ActivityInfo.SCREEN_ORIENTATION_PORTRAIT 为竖屏

【因此最好是在AndroidManifest.xml 文件中,为Activity标签设置好屏幕方向】---设置后就无需再逻辑代码中设置强制横(竖)屏

14.1: [Para determinar si la pantalla del teléfono móvil actual es horizontal o vertical, puede usar WindowManager para obtener el ancho y el alto de la pantalla del teléfono móvil y luego determinar si el ancho>alto es horizontal y viceversa...]

14.2: [Configuración del emulador de Android pantalla horizontal pantalla vertical]

	打开模拟器后 :ctrl + F12 即可切换
  1. interfaz de diseño de archivo de diseño xml, hay una lista desplegable en la parte superior, puede elegir el estado de la actividad, ya sea una pantalla horizontal o una pantalla vertical.

    Y cuando el estado de actividad se establece en pantalla horizontal, el origen de coordenadas original también cambiará, por lo que no hay necesidad de preocuparse por el problema de las coordenadas.

  2. ImgViewListener implementa View.OnTouchListener

          -----【TouchListener的捕获优先级更高,且可以处理的事件类型较多,【因此使用这个】】
    注意:      
    	style="?android:attr/buttonStyleSmall"  此属性不能少否则 ImageView不能 产生触摸离开事件】 
    
    	例:	
             <ImageView
        		android:id="@+id/right_ImgView"
    	    	style="?android:attr/buttonStyleSmall" />	
    
  3. Se encontró una excepción: después de usarse en el proyecto y asignarse a la clase java.awt.Rectangle, la compilación es normal, pero el tiempo de ejecución arroja:

    		java.lang.NoClassDefFoundError: java.awt.Rectangle
    
    
    原因:Android 底层不支持 java.awt 与,Swing,因此即使编译通过,但运行时会报错		
    

    Solución: 1. Use la API de detección de colisiones proporcionada por Android o escriba la lógica de detección de colisiones usted mismo

      2.查看JDK的Rectangle源码,把构造方法与 intersects(MyRectangle r) 提取到我的 MyRectangle工具类中。--经检测正常可用    		    	
    
  4. /**
     * 本Activity被覆盖后,调用onPuse() --> onStop();
     * 
     * 如果系统不需要内存则短时间内不会销毁,此Activity.
     * 
     * 如果发现仍然没有被销毁,则可以重写 reStart()方法,在那里面finish
     */
    @Override
    protected void onStop() {
    	// TODO Auto-generated method stub
    	super.onStop();
    
    	this.finish();
    }
    // 重新启动本Activity时调用
    @Override
    protected void onRestart() {
    	// TODO Auto-generated method stub
    	super.onRestart();
    
    	this.finish();
    }
    
  5. En el borde del lado izquierdo del editor: Haga clic con el botón derecho: agregar tarea para agregar tareas. Es conveniente recordar el trabajo que debe realizarse la próxima vez, como por ejemplo: cierta función debe implementarse mañana]

  6. Introducción a las clases de implementación de adaptador de uso común:

    1,ArrayAdapter:简单,易用的Adapter,可用于将数组或List集合多个值包装成多个列表项。
    
    2,SimpleAdapter:并不简单,功能强大的Adapter,【集合中的每一个map对象代表一个 Item数据】----适合复杂的Item展示
    					
    					//from : 子元素map中的key ,to : 要展示到的控件id
    					//例:HashMap<String, Object> row = new HashMap<String, Object>();  //一个map对象代表一个 Item数据				
    3.SimpleCursorAdapter:与SimpleAdapter基本相似,只是用于包装Cursor提供的数据库查询集---比如通讯录数据,数据库数据
    
    			
    4,【BaseAdapter:通常用于被扩张。扩展BaseAdapter可以对个列表项进行最大限度的定制。】----[公司常用]
    
    				【比如:可以做 ListView ,Spinner ,GridView ,Gallery等控件的适配器	】	
    
  7. [Optimización de memoria ListView:]
    ————————————————————————————————————————————— ———————————————————————————————————————————————————— ———————————————————————————— ———————————————————————— ————————————————————————————— —————————————————
    * [Cada vez que un El elemento se muestra en la pantalla, getView() se llamará una vez. ], es decir, establecer la vista del elemento.
    * Por lo tanto, cuando el usuario se desplaza por ListView, llamará continuamente a getView(); para mostrar el elemento. — Por lo tanto, el objeto View no se puede crear cada vez que se llama a getView.
    *
    * [Solución 1]: cuando el elemento cubierto y el elemento recién lanzado pertenecen a la misma vista, se puede usar * Puede devolver:
    convertView, es decir, el objeto de vista utilizado anteriormente se usa como el objeto de vista recién mostrado. Darse cuenta de la reutilización de View. – Guardar memoria
    *
    * [Solución 2]: cuando el elemento recién mostrado es diferente del elemento anterior, puede considerar usar el modo singleton. ----La implementación no genera el mismo objeto View duplicado
    —————————————————————————————————————— ———————————————————————————————————————————————————— —— —————————————————————————

    1. El método getView() del adaptador de datos pasará un convertView. El convertView se refiere al objeto de vista que se ha utilizado y se puede reutilizar. Sin embargo, debe evaluarse antes de usarlo. Si no está vacío, puede ser reutilizado directamente y utilizado como el
      objeto de retorno del método getview.

    [Nota: convertView es un elemento que ya se ha utilizado, por lo que si el elemento es relativamente alto, debe calcular cuántos elementos se pueden mostrar en una pantalla,

    且当position大于 beans.getSize()-1才复用convertView
    
    	否则,有时直接复用convertView可能导致有些Item永远都不能被显示出来】
    __________________________________________________________________________________________
    
    	@Override
    	public View getView(int position, View convertView, ViewGroup parent) {
    
    		/**
    		 * 【方案一:】
    		 *  	日后使用ListView 都可以考虑用这个作为ListView内存优化的模板代码
    		 */
    		TextView view = null;
    		if(convertView != null){	//判断converView是否为空,不为空则 复用
    			view = (TextView) convertView;
    		}else{
    			view = new TextView(mContext);//创建一个textView对象
    		}
    		return view;
    
    	}	
    
  8. [Optimización 2]: en el archivo xml: [La [altura] del control ListView se establece mejor en un cierto valor, o match_parent, que es más propicio para que el sistema calcule la cantidad de elementos que se pueden mostrar]

  9. [De hecho, al usar Adapter, se recomienda usar el parámetro convertView para optimizar la memoria]

  10. Para los proyectos que se han creado, puede cambiar el atributo minsdk en el archivo de manifiesto para lograr la compatibilidad con versiones anteriores de las aplicaciones de Android.

  11. Todos los archivos de recursos en resolución del proyecto se pueden obtener a través del método de contexto getResource().

    例:获取Drawable类型的 图片资源文件对象:context.getResources().getDrawable(R.drawable.news1);
    
  12. Uso: [ View.inflate(context, resource, root); carga dinámicamente el archivo de diseño y devuelve el objeto View]

    						//上下文, 需要被加载的布局文件id, root: ViewGroup ,用于包裹需要被加载的布局文件
    	view = View.inflate(mainActivity,R.layout.news_item, null); //动态加载一个布局文件,构成为一个View对象
    
  13. Luego obtenga cada objeto de control secundario en la vista y establezca el contenido del control secundario: puede usar [view.findViewById(int resid); para obtener el objeto de control secundario]

    例:
    	//获得控件对象
    	ImageView icon_ImgView = (ImageView)view.findViewById(R.id.item_img_icon);
    	...
    	//设置子控件内容
        newsBean = newsList.get(position);
    	icon_ImgView.setBackground(newsBean.getNewsIconImg());
    	....
    
  14. [Establecer el evento de clic de Item para ListView]

        news_lv1.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    
    		@Override 			
    		public void onItemClick(AdapterView<?> parent, View view,int position, long id) {
    			......
    		}
    	});
    
  15. [android:padding="10dp" significa que todo el control o control de diseño, los márgenes superior, inferior, izquierdo y derecho son todos 10dp]

  16. En el archivo de manifiesto, android:versionName="V1.0"; //representa la versión de esta aplicación

  17. Problema de detección de colisión

    Después de ser utilizado en el proyecto y mapeado a la clase java.awt.Rectangle, la compilación es normal, pero cuando se ejecuta arroja:

    			java.lang.NoClassDefFoundError: java.awt.Rectangle
    
    
    	原因:Android 底层不支持 java.awt 与,Swing,因此即使编译通过,但运行时会报错		
    

    Solución 1: use la clase Rect que viene con Android, que proporciona directamente el método de intersección, que se puede usar para la detección de colisiones

    Solución 2: vea el código fuente de Rectangle de JDK y extraiga el método de construcción e interseca (MyRectangle r) en mi clase de herramienta MyRectangle.
    – Probado y disponible normalmente

    解决办法三:自己编写碰撞检测API							
    

  18. En el desarrollo de Android y la mayoría de los sistemas de interfaz gráfica, existen regulaciones:

    1.不能在主线程中访问网络或其他耗时操作。 -----【如果在主UI线程中访问网络会造成UI卡顿,影响用户体验】
    
    2.不能在子线程中操作主界面控件。		 -----【因为 谁 创建的UI就要由 谁 管理 】
    
    
    	否则 将分别抛出这两个异常:1.android.os.NetworkOnMainThreadException 
    					    	   2.android.view.ViewRoot$CalledFromWrongThreadException, Only .....
    

    Por lo tanto, para: necesita obtener datos de la red o base de datos... y luego mostrarlos en el control, se recomienda usar: [los subprocesos acceden a la red y luego usan el controlador para notificar al control de actualización]

  19. Puede considerar usar ScrollView Nested TextView para implementar el desplazamiento de TextView para mostrar varias filas de datos

  20. En el desarrollo de Android, las operaciones de red y las operaciones que consumen mucho tiempo (por ejemplo, leer y escribir archivos grandes, leer y escribir bases de datos...) no se pueden realizar en el subproceso principal, lo que puede causar bloqueos de la interfaz de usuario.

    因此: 【如果需要在控件上显示网络,或数据库,磁盘大文件 的数据,常用 子线程+handler--Message 来实现 】
    
    						     -----子线程获取数据,handler通知更新 :msg.object 成员可以携带数据,或者用 msg.what】
    
    
    注1:【除了用 Handler --- Message解决外,还可以在子线程中使用 activity.runOnUiThread(Runnable)								
    		 把更新ui的代码创建在Runnable中,然后在需要更新ui时,把这个Runnable对象传给activity.runOnUiThread(Runnable)】
    
    					----实现在子线程中写代码但运行在主线程中,因此不会报错】
    
    注2:【 还可以用 handler.post(Runnable); 也是把代码写在runnable,但发送到主线程中运行】
    
    注3: 【利用: handler.postDelayed(r, delayMillis) ,延迟任务操作】
    

  1. [Obtenga imágenes de la red y muéstrelas en ImageView:

    	in = url_Conn.getInputStream();
    	BitMap = BitMapFactory.decodeInputStream(in);	//将输入流中的数据,编码成 Bitmap
    
    	//获得BitMap后
    	imgView1.setImageBitmap(bitMap);	//然后设置此bitmap为ImageView的内容图片
    


  1. Nota: El nombre del archivo de recursos solo puede contener letras minúsculas (az), números (0-9), guión bajo (_), punto (.) y el primer carácter no puede ser un número; de lo contrario, el sistema cometerá un error al generar el ID del recurso
    ————— ——————————————————————————————————————————— —————————— ———————————————————————————————————————

  2. Cuando se pueden usar varios objetos de mensaje en el programa, no es necesario crear objetos de mensaje cada vez

    因为获取Message对象的最好方法是调用 【Message.obtain()或者Handler.obtainMessage(), 】
    
    这样是从一个可回收对象池中获取Message对象。------可以减少内存开销
    

———————————————————————————————————————————————————— ————————————————————————————————————————————

  1. [Ingrese múltiples líneas de datos desde la computadora al teléfono móvil simulado o máquina real]

    [ 首先选中手机中需要输入信息的文本框
    
      然后 :adb shell 
           进入 shell后 : input text 填需要输进手机的文本 。就可以从电脑端输入多行数据到 安卓模拟器或真机中。
    ]
    
  2. [Varias implementaciones de temporizadores de Android:

    1.使用Handler--msg 和Thread(线程)实现定时器,在thread里面sleep()计时
    2.handler.postDelayed(r, delayMillis) ,延迟任务操作
    3.timer.schedule(task, delay)
    

  3. Cuando Eclipse importa un proyecto de Android, lo mejor es verificar la copia en el espacio de trabajo,
    [pero si hay un proyecto con el mismo nombre en este espacio de trabajo, la importación fallará y el archivo del proyecto se dañará.

    因此建议先删除本workspace下的同名project,然后再 import --》copy to workspace								
    

fecha : 2016-10-45


  1. [Atributo específico de LinearLayout: atributo showDividers de Android]

    <LinearLayout>标签的android:showDividers属性可以在LinearLayout的相应位置显示分隔线。
    
    android:showDividers属性可以设置如下4个值:
    
    	none:不显示分隔线;
    	beginning:在LinearLayout的开始处显示分隔线;
    	end:在Linearlayout的结尾处显示分隔线;
    	middle:在LinearLayout中的每两个组件间显示分隔线;
    

  1. Si una clase interna o una clase anónima se pueden definir como estáticas, se recomienda definirlas como estáticas. ¡Previniendo así fugas de memoria!

    Porque las clases internas no estáticas o las clases anónimas mantendrán una referencia a una clase externa de forma predeterminada. El método de uso es: nombre de clase externa.esto,
    por lo que si la clase interna no necesita usar la variable de instancia o el método de instancia de la clase externa. ¡Se recomienda definirlo como estático!

Ejemplo: Se recomienda definir el objeto Handler como estático.

否则,由于Handler机制独立于Activity或Service,因此当Activity或Service销毁后。Handler并不会被移除。
Handler不销毁,就会导致Activity也无法被回收,此时就很容易出现内存泄漏的问题。

  1. PhoneNumberFormattingTextWatcher

    Para números de teléfono móvil de 11 dígitos, los requisitos de espacio se agregan automáticamente, solo agregue el siguiente oyente, una clase que existe en el propio sistema PhoneNumberFormattingTextWatcher.

    mMobileEt.addTextChangedListener(new PhoneNumberFormattingTextWatcher(Locale.CHINA.getCountry()));

    http://android.xsoftlab.net/reference/android/telephony/PhoneNumberFormattingTextWatcher.html

Supongo que te gusta

Origin blog.csdn.net/UserFrank/article/details/129297600
Recomendado
Clasificación