在程序中使用代码更换App背景出错,求助!

嘤鸣求友 2014-12-23 11:33:45
public class MainActivity extends Activity implements OnClickListener
{
……

Boolean bFlag = true;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE)
{
Log.i("handle", "Landscape!");
setContentView(R.layout.activity_main_land);
}
else if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT)
{
Log.i("handle", "Portrait!");
setContentView(R.layout.activity_main);
}

……

/***************************下面是我尝试在代码中改背景,这一部分删除后程序可以正常运行*****************************/
Resources resources = getBaseContext().getResources();
Log.v("handle","ini resources!");//logcat显示了此行

Drawable btnDrawable = resources.getDrawable(R.drawable.green);;
Log.v("handle","ini drawable!");//green是一个jpg图片,如果通过xml可以替换//logcat显示了此行

LinearLayout ll = (LinearLayout) findViewById(R.layout.activity_main);
Log.v("handle","ini linearlayout!");//activity_main是一个Linearlayout布局//logcat显示了此行

btnDrawable = resources.getDrawable(R.drawable.drops);
Log.v("handle","ini btndrawable!");//drops是一个jpg图片,如果通过xml可以替换//logcat显示了此行

ll.setBackground(btnDrawable);//Color.PINK//运行到这里出错了……
//ll.setBackgroundColor(Color.MAGENTA);//这样也出错了……
Log.v("handle","ini background!");//没有显示这一行,说明上面一句出错了: java.lang.NullPointerException

/***************************上面部分删除后程序可以正常运行*****************************/
……
}
}


已经在百度、谷歌里面查过了,木有解决问题,望各位高手关于代码改背景方面,指点一二……
...全文
444 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
嘤鸣求友 2014-12-26
  • 打赏
  • 举报
回复
引用 30 楼 inquisitive_plus 的回复:
[quote=引用 29 楼 weiran2009 的回复:] 有道理,MainActivity是一个界面(主界面),Options.java是一个界面(设置界面) 在MainActivity调用Options方法的时候,设置界面当然没有启动,估计就是这个的原因吧,但是单独创建一个类,没有onCreate也是同样的错误——看来我真要恶补activity了,可惜官网被屏蔽了……
可以找找入门视频看,一些博客写的也不错。 自己也要写写demo跑一下,生命周期什么的,写一下看下输出结果就明白了。 不用activity可以的,只要有context上下文,就可以调用资源文件了。 或者用theme把,不过切换主题要刷新下界面,数据会没的。不过可以刷新保存数据再加载新的theme [/quote]呃,好吧……能推荐一些相关的教程资源吗?
windfury_plus 2014-12-25
  • 打赏
  • 举报
回复
引用 29 楼 weiran2009 的回复:
有道理,MainActivity是一个界面(主界面),Options.java是一个界面(设置界面) 在MainActivity调用Options方法的时候,设置界面当然没有启动,估计就是这个的原因吧,但是单独创建一个类,没有onCreate也是同样的错误——看来我真要恶补activity了,可惜官网被屏蔽了……
可以找找入门视频看,一些博客写的也不错。 自己也要写写demo跑一下,生命周期什么的,写一下看下输出结果就明白了。 不用activity可以的,只要有context上下文,就可以调用资源文件了。 或者用theme把,不过切换主题要刷新下界面,数据会没的。不过可以刷新保存数据再加载新的theme
嘤鸣求友 2014-12-25
  • 打赏
  • 举报
回复
引用 28 楼 inquisitive_plus 的回复:
[quote=引用 27 楼 weiran2009 的回复:] 我把SetBackground这个类删除了,而把这个类实现的方法,放在Options.java里面去了,是在onCreate之后调运的,出现了空指针错误~
贴代码,要看你怎么用的。。不过为啥optins里有oncreate? 有oncreate就要创建activity,但是你有是把这个activity当成一个工具调用……功能要分开 ———— 错误猜测: activity没创建,oncreate都没调用……所以根本没初始化导致空指针。 如果是这样,你对activity的知识需要恶补一下……[/quote] 有道理,MainActivity是一个界面(主界面),Options.java是一个界面(设置界面) 在MainActivity调用Options方法的时候,设置界面当然没有启动,估计就是这个的原因吧,但是单独创建一个类,没有onCreate也是同样的错误——看来我真要恶补activity了,可惜官网被屏蔽了……
windfury_plus 2014-12-24
  • 打赏
  • 举报
回复
引用 21 楼 weiran2009 的回复:
这样你就获得了一个drawable 这个是临时写的,你可以考虑下完善它。
Contest我刚查了一些资料,但是觉得没有实例难以理解,在我这个问题中——限于水平——你给出的这个静态方法,是放在SetBackground.java类中吗?具体如何调用?但我觉得,问题不是在这儿吧,系统提示出错是 空指针,但我没觉得哪儿数据传递有问题呀?[/quote]

public class MainActivity extends Activity{
	Resources resources = getBaseContext().getResources();//oncreate前获取是空的,出错
   
	@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}
上面这么简单的例子都报错。。可见不能在oncreate之前使用this,因为都没初始化。这就是你那空指针的问题
windfury_plus 2014-12-24
  • 打赏
  • 举报
回复
引用 22 楼 weiran2009 的回复:
[quote=引用 20 楼 yueqinglkong 的回复:] 好像 有直接主题的接口吧 没感觉有lz的那么复杂的样子
我在网上查了一些资料,似乎说Context的比较多,接口什么的没有相关信息…… 另外,我觉得这个问题应该很普遍吧,怎么没有相关信息呢? MainActivity.java开始时提取Options.java的内容,更换自己背景 Options.java设置MainActivity的背景 发现MainActivity类的东西Options一用,就空指针错误……[/quote] 上面说的是theme。用setTheme可以更改主题,在manifest文件里的 <application android:theme="@style/AppTheme" >就是一种。像android:Theme.Light~ 嗯,刚才的setMyDrawable是放在其他类里的,当成工具类使用里面的R.drawable.ic_launcher可以当成一个参数传入 这样就把获取drawable的工作抽离开来了。 mvc思想 空指针问题我已经说过了,oncreate之前获取不了资源文件resources是空的……
嘤鸣求友 2014-12-24
  • 打赏
  • 举报
回复
引用 20 楼 yueqinglkong 的回复:
好像 有直接主题的接口吧 没感觉有lz的那么复杂的样子
我在网上查了一些资料,似乎说Context的比较多,接口什么的没有相关信息…… 另外,我觉得这个问题应该很普遍吧,怎么没有相关信息呢? MainActivity.java开始时提取Options.java的内容,更换自己背景 Options.java设置MainActivity的背景 发现MainActivity类的东西Options一用,就空指针错误……
嘤鸣求友 2014-12-24
  • 打赏
  • 举报
回复
引用 19 楼 inquisitive_plus 的回复:
[quote=引用 17 楼 weiran2009 的回复:] 额,这怎么办我想试图将程序模块化,以后我想把 设置背景、设置音量都放在一个专门的Setting.java中,现在连设置背景都不能单独搞一个类,以后主函数可真冗长的…… 另,我的setBackground.java必须extends acticity,要不然 Resources resources = getBaseContext().getResources(); Drawable btnDrawable = resources.getDrawable(R.drawable.green);; 这两行会出错,错误在于,找不到getBaseContext()。而继承Activity,就有了……木有办法呀……
你可以传context例如:

public static Drawable setMyDrawable(Context context){
		Resources resources = context.getResources();
		Drawable btnDrawable =resources.getDrawable(R.drawable.ic_launcher);
		return btnDrawable;
	}
这样你就获得了一个drawable 这个是临时写的,你可以考虑下完善它。[/quote] Contest我刚查了一些资料,但是觉得没有实例难以理解,在我这个问题中——限于水平——你给出的这个静态方法,是放在SetBackground.java类中吗?具体如何调用?但我觉得,问题不是在这儿吧,系统提示出错是 空指针,但我没觉得哪儿数据传递有问题呀?
蒲锦_up 2014-12-24
  • 打赏
  • 举报
回复
好像 有直接主题的接口吧 没感觉有lz的那么复杂的样子
windfury_plus 2014-12-24
  • 打赏
  • 举报
回复
引用 17 楼 weiran2009 的回复:
额,这怎么办我想试图将程序模块化,以后我想把 设置背景、设置音量都放在一个专门的Setting.java中,现在连设置背景都不能单独搞一个类,以后主函数可真冗长的…… 另,我的setBackground.java必须extends acticity,要不然 Resources resources = getBaseContext().getResources(); Drawable btnDrawable = resources.getDrawable(R.drawable.green);; 这两行会出错,错误在于,找不到getBaseContext()。而继承Activity,就有了……木有办法呀……
你可以传context例如:

public static Drawable setMyDrawable(Context context){
		Resources resources = context.getResources();
		Drawable btnDrawable =resources.getDrawable(R.drawable.ic_launcher);
		return btnDrawable;
	}
这样你就获得了一个drawable 这个是临时写的,你可以考虑下完善它。
qbidper 2014-12-24
  • 打赏
  • 举报
回复
有个想法,你的更换背景不要放在oncreat,还有其他生命周期。 主要是你要等onCreat里面把控件加载后,才能找到id
windfury_plus 2014-12-24
  • 打赏
  • 举报
回复
引用 27 楼 weiran2009 的回复:
我把SetBackground这个类删除了,而把这个类实现的方法,放在Options.java里面去了,是在onCreate之后调运的,出现了空指针错误~
贴代码,要看你怎么用的。。不过为啥optins里有oncreate? 有oncreate就要创建activity,但是你有是把这个activity当成一个工具调用……功能要分开 ———— 错误猜测: activity没创建,oncreate都没调用……所以根本没初始化导致空指针。 如果是这样,你对activity的知识需要恶补一下……
嘤鸣求友 2014-12-24
  • 打赏
  • 举报
回复
引用 26 楼 inquisitive_plus 的回复:
[quote=引用 25 楼 weiran2009 的回复:] 呃,前辈,我的resources赋值是在onCreate之后,只不过是在MainActivity的界面中,调取SetBackground界面中的方法造成了空指针问题,如果直接在MainActivity中自己调用,就没有这个错误……
不懂你说什么。。SetBackground的代码不是你12楼贴了么, “调取SetBackground界面中的方法造成了空指针问题,”这句话什么意思,你SetBackground哪里有方法可以调用。。就一个构造函数。。 还是说SetBackground界面中调用getBaseContext().getResources()? 那这个错误在24楼已经验证了……[/quote] 我把SetBackground这个类删除了,而把这个类实现的方法,放在Options.java里面去了,是在onCreate之后调运的,出现了空指针错误~
windfury_plus 2014-12-24
  • 打赏
  • 举报
回复
引用 25 楼 weiran2009 的回复:
呃,前辈,我的resources赋值是在onCreate之后,只不过是在MainActivity的界面中,调取SetBackground界面中的方法造成了空指针问题,如果直接在MainActivity中自己调用,就没有这个错误……
不懂你说什么。。SetBackground的代码不是你12楼贴了么, “调取SetBackground界面中的方法造成了空指针问题,”这句话什么意思,你SetBackground哪里有方法可以调用。。就一个构造函数。。 还是说SetBackground界面中调用getBaseContext().getResources()? 那这个错误在24楼已经验证了……
嘤鸣求友 2014-12-24
  • 打赏
  • 举报
回复
引用 24 楼 inquisitive_plus 的回复:
[quote=引用 21 楼 weiran2009 的回复:] 这样你就获得了一个drawable 这个是临时写的,你可以考虑下完善它。
Contest我刚查了一些资料,但是觉得没有实例难以理解,在我这个问题中——限于水平——你给出的这个静态方法,是放在SetBackground.java类中吗?具体如何调用?但我觉得,问题不是在这儿吧,系统提示出错是 空指针,但我没觉得哪儿数据传递有问题呀?[/quote]

public class MainActivity extends Activity{
	Resources resources = getBaseContext().getResources();//oncreate前获取是空的,出错
   
	@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}
上面这么简单的例子都报错。。可见不能在oncreate之前使用this,因为都没初始化。这就是你那空指针的问题[/quote] 呃,前辈,我的resources赋值是在onCreate之后,只不过是在MainActivity的界面中,调取SetBackground界面中的方法造成了空指针问题,如果直接在MainActivity中自己调用,就没有这个错误……
嘤鸣求友 2014-12-23
  • 打赏
  • 举报
回复
引用 2 楼 qbidper 的回复:
空指针,输出一下btnDrawable的值看看
更改和输出如下: Drawable btnDrawable = resources.getDrawable(R.drawable.green);; Log.v("handle","ini drawable!");//green是一个jpg图片,如果通过xml可以替换//logcat显示了此行 Log.v("handle", "after green :btnDrawable: " + btnDrawable); LinearLayout ll = (LinearLayout) findViewById(R.layout.activity_main); Log.v("handle","ini linearlayout!");//activity_main是一个Linearlayout布局//logcat显示了此行 btnDrawable = resources.getDrawable(R.drawable.drops); Log.v("handle","ini btndrawable!");//drops是一个jpg图片,如果通过xml可以替换//logcat显示了此行 Log.v("handle", "after drops :btnDrawable: " + btnDrawable); ————————————————————————————加了2句,输出分别为: after green :btnDrawable: android.graphics.drawable.BitmapDrawable@41857b58 after drops :btnDrawable: android.graphics.drawable.BitmapDrawable@417ea590 ———————————————————————————————— 有什么其它更改背景的好方法吗?
嘤鸣求友 2014-12-23
  • 打赏
  • 举报
回复
引用 1 楼 u012886582 的回复:
把logcat也贴出吧。 LinearLayout ll = (LinearLayout) findViewById(R.layout.activity_main)??映射错了吧
隐射错是什么概念? R.layout.activity_main:

<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:layout_margin="1dp"
    android:layout_marginRight="1dp"
……
线性布局没错吧? 第一个error是: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.TT.tomatotimer/com.TT.tomatotimer.MainActivity}: java.lang.NullPointerException
qbidper 2014-12-23
  • 打赏
  • 举报
回复
空指针,输出一下btnDrawable的值看看
Fiod 2014-12-23
  • 打赏
  • 举报
回复
把logcat也贴出吧。 LinearLayout ll = (LinearLayout) findViewById(R.layout.activity_main)??映射错了吧
嘤鸣求友 2014-12-23
  • 打赏
  • 举报
回复
引用 16 楼 inquisitive_plus 的回复:
[quote=引用 14 楼 weiran2009 的回复:] 然后在Main_Activity中onCreate里面new一个: SetBackground sbg = new SetBackground(); Log.v("handle","new sbg up!");//结果又是空指针错误,这是为什么呢?
空指针会指明哪一行,具体是哪个?[/quote] 我一开始的问题是MainActivity.java的类 里面直接修改背景,经过大家的帮助解决问题了,因此我想把修改背景的功能独立出来,放在另外一个SetBackground.java的类中,通过调用SetBackground.java来的方法修改背景:
public class SetBackground extends Activity
{
	public int iFlag = 1;
	Resources resources = getBaseContext().getResources();
	Drawable btnDrawable = resources.getDrawable(R.drawable.green);;
	LinearLayout ll = (LinearLayout) findViewById(R.id.activity_main);//还是这里除了问题
        btnDrawable = resources.getDrawable(R.drawable.drops);//仍然是此处警告空指针错误,也就是说上面的ll没有赋值正确。

	SetBackground()
	{	
	//	ll = (LinearLayout) findViewById(R.id.activity_main);
	}
}
[/quote] 有问题。。你这个是继承一个activity,你不能在oncreate之前进行 findViewById或者使用资源文件。会找不到的。[/quote] 额,这怎么办我想试图将程序模块化,以后我想把 设置背景、设置音量都放在一个专门的Setting.java中,现在连设置背景都不能单独搞一个类,以后主函数可真冗长的…… 另,我的setBackground.java必须extends acticity,要不然 Resources resources = getBaseContext().getResources(); Drawable btnDrawable = resources.getDrawable(R.drawable.green);; 这两行会出错,错误在于,找不到getBaseContext()。而继承Activity,就有了……木有办法呀……
windfury_plus 2014-12-23
  • 打赏
  • 举报
回复
引用 14 楼 weiran2009 的回复:
然后在Main_Activity中onCreate里面new一个: SetBackground sbg = new SetBackground(); Log.v("handle","new sbg up!");//结果又是空指针错误,这是为什么呢?
空指针会指明哪一行,具体是哪个?[/quote] 我一开始的问题是MainActivity.java的类 里面直接修改背景,经过大家的帮助解决问题了,因此我想把修改背景的功能独立出来,放在另外一个SetBackground.java的类中,通过调用SetBackground.java来的方法修改背景:
public class SetBackground extends Activity
{
	public int iFlag = 1;
	Resources resources = getBaseContext().getResources();
	Drawable btnDrawable = resources.getDrawable(R.drawable.green);;
	LinearLayout ll = (LinearLayout) findViewById(R.id.activity_main);//还是这里除了问题
        btnDrawable = resources.getDrawable(R.drawable.drops);//仍然是此处警告空指针错误,也就是说上面的ll没有赋值正确。

	SetBackground()
	{	
	//	ll = (LinearLayout) findViewById(R.id.activity_main);
	}
}
[/quote] 有问题。。你这个是继承一个activity,你不能在oncreate之前进行 findViewById或者使用资源文件。会找不到的。
加载更多回复(11)
本课程讲了Vue3+Vue2+Uni-app(uniapp)入门基础与实战,其还重点讲解了ES6、TypeScript这些基础知识,实战由两大价值5000元的真实企业级项目组成,分别是仿京东电商网站和仿美团微信点餐小程序,同时两大项目代码全部赠送,还赠送前后端架构模板,工作直接使用。VUE和uni-app是目前热门的前端框架,本课程教你如何快速学会VUE和uni-app并应用到实战,教你如何解决内存泄漏,常用UI库的使用,自己封装组件和插件,正式上线白屏问题,性能优化、解决iphoneX“刘海”兼容性问题、微信支付、微信授权登录,获取位置在地图上显示,获取用户所在的城市和街道信息,微信小程序发布审核等。对正在工作当或打算学习VUE和uni-app高薪就业的你来说,那么这门课程便是你手的葵花宝典。学习技巧:学习当不要只看,一定要多敲代码,如果碰到某一个知识点不是很明白,不要钻牛角尖,千万不要因为一个点,放弃整个森林,接着往下学,硬着头皮开发项目。只要能亲自开发一个完整的项目,你会发现不明白的地方自然而然就明白了,项目做出来就真正的学会了。此vue和uni-app课程以面试和实战为基础进行讲解,每个知识点都会让你知道在实际项目开发如何使用,学习后,可以开发大型项目,增强逻辑思维,至少让你拥有3年以上开发经验的实力!代码和ppt均可下载!免费提供《企业级完整实战项目接口文档》,绝对可用

80,349

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧