安卓控件注入

package com.example.smartinject;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

import android.app.Activity;
import android.content.res.Resources;
import android.view.LayoutInflater;
import android.view.View;
/**
 * 使用说明:</br>
 * 只需让自定义Activity继承该SupportActivity,然后让自定义Activity的控件字段名称和加载的布局文件中控件的id名称相同即可,
 * 这样在调用setContentView(View view)或setContentView(int layoutResID)后,控件字段就被注入值了,之后就可以调用控件字段所拥有的方法了。</br></br>
 * 若同时在自定义Activity上实现了android.view.View.OnClickListener接口后,点击控件后就会自动调用复写的public void onClick(View v)方法了
 * @author Young
 * @Time 2015-7-4
 */
public class SupportActivity extends Activity {
	public void setContentView(int layoutResID) {
		setContentView(LayoutInflater.from(this).inflate(layoutResID, null));
	};
	@Override
	public void setContentView(View view) {
		// TODO Auto-generated method stub
		super.setContentView(view);
		smartInject();
	}
	private void smartInject() {
		Class<? extends Activity> clz=getClass();
		Field[] fs=clz.getDeclaredFields();
		Resources res = getResources();
		String packageName = getPackageName();
		for (Field field : fs) {
			int viewId = res.getIdentifier(field.getName(), "id", packageName);
			if (viewId==0)
				continue;
			field.setAccessible(true);
			try {
				View v=findViewById(viewId);
				field.set(this,v);
				Class<?> c=field.getType();
				Method m=c.getMethod("setOnClickListener", android.view.View.OnClickListener.class);
				m.invoke(v, this);
			} catch (Exception e) {
				e.printStackTrace();
			}
			field.setAccessible(false);

		}

	}
}

<pre name="code" class="java">package com.example.smartinject;

import java.util.Date;

import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends SupportActivity implements OnClickListener{
	Button but1;
	Button but2;
	Button but3;
	Button but4;
	TextView tv;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
//		再也不需要下面这么啰嗦恶心的操作了
//		but1=(Button) findViewById(R.id.but1);
//		but2=(Button) findViewById(R.id.but2);
//		but3=(Button) findViewById(R.id.but3);
//		but4=(Button) findViewById(R.id.but4);
//		tv=(TextView) findViewById(R.id.tv);
//		but1.setOnClickListener(this);
//		but2.setOnClickListener(this);
//		but3.setOnClickListener(this);
//		but4.setOnClickListener(this);
//		tv.setOnClickListener(this);

		but1.setText("inject ok");

	}
	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		switch (v.getId()) {
		case R.id.tv:
			Toast.makeText(getApplicationContext(), "inject", 1).show();
			tv.setText("tv  click  "+new Date().toLocaleString());
			break;
		case R.id.but1:
			Toast.makeText(getApplicationContext(), "inject", 1).show();
			but1.setText("but click "+new Date().toLocaleString());
			break;

		default:
			((TextView)v).setText(""+v.toString()+"  "+System.currentTimeMillis());
			break;
		}

	}

}

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

    <Button
        android:id="@+id/but1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="button"/>
    <Button
        android:id="@+id/but2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="button"/>
    <Button
        android:id="@+id/but3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="button"/>
    <Button
        android:id="@+id/but4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="button"/>
</LinearLayout>

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-17 13:13:27

安卓控件注入的相关文章

不同版本安卓控件的样式统一

其实很简单,只需要简单的几部. 首先更新Android Support Library 至 22.1或者以上的版本 在项目中添加对Suppert V7包的引用 在AndroidManifest.xml中的application标签下添加 样式声明 android:theme="@style/Theme.AppCompat"(你也可以使用样式文件继承这个样式,修改其中的某些属性) 确保你项目中的所有Activity都继承自AppCompatActivity 随后重新编译你的项目,你会发现

安卓----控件基础

  今天学习安卓的控件发现和WEB的相似,只不过WEB是通过代码然后再页面上显示,但是安卓的只需点击相应的控件拉到Component Tree里.个人觉得安卓的界面搭建比WEB的简单,不需要耗费太多时间. 而且和WEB一样,每个控件都有一个id,我们通过其id来建立它们之间的联系. 用每一个控件时,都得需要配置ConstraintLayout,如果不配置就不会显示.在初学阶段,这两个线很重要(一个水平,一个垂直),通过它们我们可以来控制控件的位置,而且一旦连接,就很容易改变配件的位置. 每一个配

安卓控件隐藏和显示动画

import android.os.Handler; import android.view.View; import android.view.animation.Animation; import android.view.animation.TranslateAnimation; public class AnimationUtil { /**  * 从控件所在位置移动到控件的底部  *   * @return  */ public static TranslateAnimation mo

安卓学习————安卓控件之ProgressBar

ProgressBar ProgressBar,进度条,是AndroidUI界面中一个非常实用的组件,通常用于向用户显示某个耗时操作完成的百分比.因此它需要动态的显示进度,从而避免长时间的执行某个耗时的操作,而让用户感觉程序失去了相应,从而提高界面的友好性. 从官方文档上看,为了适应不同的应用环境,Android内置了几种风格的进度条,可以通过Style属性设置ProgressBar的风格.支持如下属性,后面在示例中会一一展示: @android:style/Widget.ProgressBar

安卓学习————安卓控件之EditText

最近在看老罗的安卓视频,学着做了几小例子下面的代码是一个使用EditText输入特定字符的例子,这里只给出xml文件: <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="android:digits attribute number"/> <EditText android:layout

安卓学习————安卓控件之GridView

今天写了一个简单的GridView,它是格子视图,可以将很多图片以一定大小显示出来在做相册.图片浏览是非常有用一下是xml文件: 1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="match_

安卓控件获取器uiautomatorviewer初体验:&quot;unable to connect to the adb. check if adb is installed correctly&quot;

解决方法:转自:https://plus.google.com/108487870030743970488/posts/2TrMqs1ZGQv Challenge Accepted:1. ScreenshotAction class has this in its run() method when !DebugBridge.isInitialized() 2. DebugBridge is not initialized when it can't find the "platform-too

Android基本控件之GridView

我们在使用手机的过程中,会看到一些图片配上文字的一些情况,今天我们就来介绍一下安卓控件的GridView GridView组件用来以网格方式排列视图,与矩阵类似,当屏幕上有很多元素(文字.图片或其他元素)需要显示时,可以使用该组件 二话不说,我们先上图: 今天,我们就来实现这样的一个即显示图片又显示文字的一个GridView 我们首先来分析一下,我们如果想实现这样的一个GridView都需要些什么资源吧 说到资源,我们肯定是需要这么一大堆的图片呀~ 然后,我们再来分析一下,我们需要在布局文件上做

安卓开发_单选按钮控件(RadioButton)的简单使用

最近复习安卓基础的时候发现没有写关于单选按钮.复选按钮的博客,可能因为以前学习的时候感觉太简单了就没有写,现在补上吧 当我们在各种客户端注册账号的时候,会有几项单选项,比如选择您的性别.下面就是学习怎么实现这种效果 一.安卓中,单选按钮用RadioButton表示,因为RadioButton是Button的子类,所以可以使用Button的各种属性 RadioButton一般是不单独使用的需要结合RadioGroup控件一起使用,将若干个RadioButton放在一个RadioGroup中,那么将