Android中在非Activity中添加Toast等View控件问题的解决方法

一般写程序主函数很长会不美观,更不好阅读!解决方法当然写到子类里,或建个方法去出来,但有网友可能遇到和博主同样的问题,像Toast,Dialog或者Button、TextView这些在Activity里才能使用的控件到了非Activuty使用总会出错。。。很是头疼,博主前段时间也是困惑了很长时间,终于找到方法,百试不爽。。。这都源于java基础的薄弱啊。。。没办法,好多童鞋和博主一样有点C的基础就上手Android了。。。java基础还得补补,好了不废话,看方案:

在主程序中定义了个开关按钮 ToggleButton

ToggleButton toggleButton = (ToggleButton) findViewById(R.id.ToggleButton);

现在要处理这个按钮:

ToggleButtonListener toggleButtonListener=new ToggleButtonListener();
toggleButtonListener.setToggleButtonListener(toggleButton);

这里的ToggleButtonListener是Android没有的,自定义的,程序当然会提示出错了!这样写的好处就是可以右击直接Create就直接新建出来ToggleButtonListene类。

上面第二行的setToggleButtonListener也是在ToggleButtonListener中自定义的方法,同样也是右击生成。

这样就可以setToggleButtonListener里添加自定义的点击事件了:

public void setToggleButtonListener(ToggleButton toggleButton) {
		// TODO Auto-generated method stub
		toggleButton.setOnCheckedChangeListener(new OnCheckedChangeListener() {
			
			@Override
			public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
				// TODO Auto-generated method stub
				if (isChecked) {
					Toast.makeText(context, "现在是选中", 1).show();
				} else {
					Toast.makeText(context, "现在未选中", 1).show();
				}

			}
		});
	}

但是有经验的同学会发现这里的Toast会报错,不管用this或getApplication()都是不可以的,主要是因为像Toast这种控件都是要有上下文的时候才可以使用的,上下文就是Context了,这个知识点自行百度吧...

处理这个方法就是通过构造函数将主函数里的Context传递过来,具体方法:

1、在子类里定义一个Context

private Context context;

2、再添加一个传递函数

	public ToggleButtonListener(Context context) {
		this.context = context;
	}

其实这里有个技巧,就是当定义好了Context后可以右击  private Context context 中的 context -->Source-->Generate Constructor using Fields自动添加这个方法!

设定好后就会发现Toast一切正常,可以使用了!

但是别忘了这里是将主函数里的Context传递过来的,所以再主函数里将

ToggleButtonListener toggleButtonListener=new ToggleButtonListener();
改为:

ToggleButtonListener toggleButtonListener=new ToggleButtonListener(MainActivity.this);

一切OK!看看完整代码:

主程序MainActivity:

public class MainActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
                ToggleButton toggleButton = (ToggleButton) findViewById(R.id.ToggleButton);
		ToggleButtonListener toggleButtonListener=new ToggleButtonListener(MainActivity.this);
		toggleButtonListener.setToggleButtonListener(toggleButton);
}

子类ToggleButtonListener:

public class ToggleButtonListener {
	private Context context;

	public ToggleButtonListener(Context context) {
		this.context = context;
	}

	public void setToggleButtonListener(ToggleButton toggleButton) {
		// TODO Auto-generated method stub
		toggleButton.setOnCheckedChangeListener(new OnCheckedChangeListener() {
			
			@Override
			public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
				// TODO Auto-generated method stub
				if (isChecked) {
					Toast.makeText(context, "现在是选中", 1).show();
				} else {
					Toast.makeText(context, "现在未选中", 1).show();
				}

			}
		});
	}
}


这里还要提醒大家的就是代码优化的问题!这里的:

ToggleButtonListener toggleButtonListener=new ToggleButtonListener(MainActivity.this);
是不好的,每次都要创建一下,建议直接先定义好

ToggleButtonListener toggleButtonListener;

然后再使用这个自定的方法!


好了结束了,初学者看看,老鸟就别笑话里面的方法、类什么的表述错误了,有时候知道是怎么个回事就是表述不出来啊。。。

转载请注明出处啊:http://blog.csdn.net/handsomeslow/article/details/15505345


你可能感兴趣的:(android)