新手第一天,创建一个简单的工程,点击按钮改变文本背景颜色,遇到了尼玛一大堆问题,总结一下。
一、在添加按钮监听事件的时候,提示:
1)、类型 View 中的方法 setOnClickListener(View.OnClickListener)对于参数(new OnClickListener(){})不适用
2)、OnClickListener 无法解析为类型
3)、类型为 new OnClickListener(){} 的方法 onClick(View)必须覆盖或实现超类型方法
这是因为没有导入OnClickListener包,在代码开头部分添加import android.view.View.OnClickListener; 即可。
二、xml文件中的警告信息:[I18N] Hardcoded string "Button", should use @string resource
这是警告表示当前Button的text是硬编码,就是文本写死了。可以在res/values/strings.xml中配置
首先将android:text=“Button”改成 android:text=“@string/Button”,然后在res/values/strings.xml中的<resources>中添加
<string name="Button">确认</string>
三、APP安装失败,提示:The application has stopped unexpectedly. please try again.
如图:
关于这个问题花了一天的时间,网上搜了很久,最后在一个帖子里面才找到了解决办法。
没有找到相应的控件,即通过findViewById()返回的值为null。可能是由于下面几个原因造成的:
1)、代码中的ID与xml文件中ID不同;将ID改为相同的ID
2)、findViewByid()方法放在了setContentView(R.layout.xx)之前;将位置调换一下。
3)、clean一下工程,让ID重新生成。
4)、控件位置放错了地方。在res/layout/文件夹下面一共有两个xml文件,在函数onCreate中默认调用的是activity_main.xml,即:setContentView(R.layout.activity_main); 而控件却是放在fragment_main.xml中。 这个解决办法有两种:
a、将控件移到activity_main.xml中。但是个人不太喜欢这种方式。
b、控件仍然放在fragment_main.xml中,但是将自己需要添加的代码放在PlaceholderFragment类的onCreateView函数中(PlaceholderFragment类是MainActivity类的一个静态内部类,相当于当前活动的一个容器),然后通过rootview来获取控件的ID,如:final Button btn1 = (Button)rootView.findViewById(R.id.button1); 这段代码要放在工程自动创建的代码View rootView = inflater.inflate(R.layout.fragment_main, container, false); 的后面。获取到控件ID后,就可以根据自己的需要添加自己的代码了。
问:
1、为什么我在oncreate()中将setContentView(R.layout.activity_main)直接改成 setContentView(R.layout.fragment_main)还是出错?
2、把oncreate()中的setContentView(R.layout.activity_main)改成如下代码还是报错?
LayoutInflater inflater = LayoutInflater.from(this);
View layout=(View)inflater.inflate(R.layout.fragment_main, null);
setContentView(layout);
3、把oncreate()中的setContentView(R.layout.activity_main)改成如下代码结果能获取到ID,但是程序运行时还是会出错?
LayoutInflater inflater = LayoutInflater.from(this);
View layout=(View)inflater.inflate(R.layout.fragment_main, null);
setContentView(R.layout.activity_main);
final Button btn1 = (Button)layout.findViewById(R.id.button1);
final TextView TV1 = (TextView)layout.findViewById(R.id.textView1);