我在Eclipse中创建了一个新的应用程序,目标是Jelly Bean.这是所有自动创建的代码.清单将应用程序主题设置为AppName:
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
. . .
Run Code Online (Sandbox Code Playgroud)
对于值dir中的样式,它转换为AppBaseTheme:
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<!--
Base application theme, dependent on API level. This theme is replaced
by AppBaseTheme from res/values-vXX/styles.xml on newer devices.
-->
<style name="AppBaseTheme" parent="android:Theme.Light">
<!--
Theme customizations available in newer API levels can go in
res/values-vXX/styles.xml, while customizations related to
backward-compatibility can go here.
-->
</style>
<!-- Application theme. -->
<style name="AppTheme" parent="AppBaseTheme">
<!-- All customizations that are NOT specific to a particular API-level can go here. …
Run Code Online (Sandbox Code Playgroud) 鉴于此代码绘制一条线:
Paint p;
p = new Paint(Paint.ANTI_ALIAS_FLAG);
p.setColor(android.graphics.Color.WHITE);
p.setStyle(Paint.Style.FILL);
p.setStrokeWidth(21);
canvas.drawLine(0,50,100,50,p);
Run Code Online (Sandbox Code Playgroud)
有3种可能的描笔策略:
在实践中,似乎默认行为遵循中心策略.是否可以修改油漆以产生与其他策略相对应的结果?
拥有此自定义视图MyView
我定义了一些自定义属性:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="MyView">
<attr name="normalColor" format="color"/>
<attr name="backgroundBase" format="integer"/>
</declare-styleable>
</resources>
Run Code Online (Sandbox Code Playgroud)
并在布局XML中将它们分配如下:
<com.example.test.MyView
android:id="@+id/view1"
android:text="@string/app_name"
. . .
app:backgroundBase="@drawable/logo1"
app:normalColor="@color/blue"/>
Run Code Online (Sandbox Code Playgroud)
起初我以为我可以backgroundBase
使用以下方法检索自定义属性:
TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.MyView, defStyle, 0);
int base = a.getInteger(R.styleable.MyView_backgroundBase, R.drawable.blank);
Run Code Online (Sandbox Code Playgroud)
仅在未分配属性且R.drawable.blank
返回默认值时才有效.
当app:backgroundBase
赋值时抛出异常"无法转换为整数类型= 0xn",因为即使自定义属性格式将其声明为整数,它实际上引用了a Drawable
,应该按如下方式检索:
Drawable base = a.getDrawable(R.styleable.MyView_backgroundBase);
if( base == null ) base = BitMapFactory.decodeResource(getResources(), R.drawable.blank);
Run Code Online (Sandbox Code Playgroud)
这很有效.
现在我的问题:
我真的不想Drawable
从TypedArray中获取,我想要对应的整数id app:backgroundBase
(在上面的示例中它将是 R.drawable.logo1
).我怎么才能得到它?
我试图定义一个利用资源的静态哈希表,但是由于无法静态访问资源而陷入困境.
然后我意识到,定义静态地图的最佳位置是资源文件本身.
如何在XML中定义地图?我相信如果可能的话,它应该类似于Listpreference机制,包含条目和条目值.
关于IntentService的使用我有点困惑.
我很确定我在文档中读到somwhere只有系统调用onStartCommand()一次,如果你发出两次startService(),第二次调用不会导致调用onStartCommand().
我可能在这里错了,因为我一直在寻找这篇文档而我似乎无法找到它.
这与先前的概念相矛盾,该概念表明您可以通过onStartCommand()在IntentService中排队许多意图.
所以我在这里需要帮助,如何在IntentService上排队多个意图?
我只看到两个选项:
只需使用不同的意图调用每次startService()
直接调用onStart()或onStartCommand()(绕过startService())
我想创建一个静态哈希表来将字符串转换为整数.需要注意的是,我想在XML文件中的几个列表中使用我定义为资源的字符串.
我只能使用资源ID写这个:
public class MyActivity extends Activity {
private static Map<Integer, Integer> views = new HashMap<Integer, Integer>();
static {
views.put(R.string.full_text, MessageTable.VIEW_FULL);
views.put(R.string.only_text, MessageTable.VIEW_MSG);
views.put(R.string.tag_text, MessageTable.VIEW_TAGMSG);
}
Run Code Online (Sandbox Code Playgroud)
我没有错误,但我真正需要做的是这样的事情:
public class MyActivity extends Activity {
private static Map<String, Integer> views = new HashMap<String, Integer>();
static {
views.put(getResources().getString(R.string.full_text), MessageTable.VIEW_FULL);
views.put(getResources().getString(R.string.only_text), MessageTable.VIEW_MSG);
views.put(getResources().getString(R.string.tag_text), MessageTable.VIEW_TAGMSG);
}
Run Code Online (Sandbox Code Playgroud)
这给了我在Eclipse中的以下错误:
Cannot make a static reference to the non-static method getResources() from the type ContextWrapper
Run Code Online (Sandbox Code Playgroud)
这个消息很有意义,但没有意义的是资源无法从静态块中访问,人们会认为静态变量是自定义创建的以利用资源.
我想我可以在对象构造函数中填充Hash表,但这意味着要在错误的位置执行它.
最终目标很快就会明确.
我想创建一个文件对象,而不是从真实的物理文件中获取数据,我想自己提供缓冲区.
然后,我想使用这个文件,它不是真正存在于SD卡中或我应用程序之外的任何地方,给它起一个名字并通过电子邮件作为附件发送(使用EXTRA_STREAM).
我发现以下一点代码,由Adriaan Koster(@adriaankoster),在Java中写入字节[]到文件
// convert byte[] to File
ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
ObjectInputStream ois = new ObjectInputStream(bis);
File fileFromBytes = (File) ois.readObject();
bis.close();
ois.close();
System.out.println(fileFromBytes);
Run Code Online (Sandbox Code Playgroud)
我用它来创建这个功能
private File fileFromBytes(byte[] buf) {
File f = null;
try {
ByteArrayInputStream bis = new ByteArrayInputStream(buf);
ObjectInputStream ois = new ObjectInputStream(bis);
f = (File) ois.readObject();
bis.close();
ois.close();
}
catch (Exception e) {}
return f;
}
Run Code Online (Sandbox Code Playgroud)
这就是我被卡住的地方,因为当我使用它时:
// When sent as body the mail is sent OK
// emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, dump());
// …
Run Code Online (Sandbox Code Playgroud) 似乎没有简单的方法来获取Alert对话框来返回一个简单的值.
这段代码不起作用(答案变量不能在侦听器中设置,实际上它甚至不编译)
public static boolean Confirm(Context context) {
boolean answer;
AlertDialog dialog = new AlertDialog.Builder(context).create();
dialog.setTitle("Confirmation");
dialog.setMessage("Choose Yes or No");
dialog.setCancelable(false);
dialog.setButton(DialogInterface.BUTTON_POSITIVE, "Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int buttonId) {
answer = true;
}
});
dialog.setButton(DialogInterface.BUTTON_NEGATIVE, "No", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int buttonId) {
answer = false;
}
});
dialog.setIcon(android.R.drawable.ic_dialog_alert);
dialog.show();
return answer;
}
Run Code Online (Sandbox Code Playgroud)
注意:重要的是该方法是自包含的,即它不依赖于变量或外部的结构.只需打电话给你,得到你的答案,无论是真是假.
那么该怎么办?这个简单的返回的愿望真或假的似乎要复杂得多,值得.
此外,setButton方法具有以下形式:
dialog.setButton(int buttonId, String buttonText, Message msg)
Run Code Online (Sandbox Code Playgroud)
但目前尚不清楚如何使用它,发送到哪个meesage,使用哪个处理程序?
我认为这是专家的问题.
我从ListView数据列表中调用getView()
了positon 超出界限的调用.
当我使用适配器过滤器时会发生这种情况 过滤器方法使用小于原始列表的过滤列表填充数据.
当新筛选的列表比先前 筛选的列表短时,似乎发生错误.我更改了代码,在越界时返回一个虚拟convertView,只是为了查看发出了多少这样的调用.publishResults()
getView()
这些是log
我记录的相关代码和消息:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// No logs here to keep ListView performance good
Log.d(TAG, "+ getView( position=" + position + ")");
ViewHolder holder;
if( position >= mData.size() ) {
// This code allows to see how many bad calls I get
Log.w(TAG, "position out of bounds!");
convertView = mInflater.inflate(mLayout, parent, false); …
Run Code Online (Sandbox Code Playgroud) LinearLayout
我的应用程序中有几个这样的背景:
android:background="@drawable/metal_plate"
Run Code Online (Sandbox Code Playgroud)
绘制\ metal_plate.xml:
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/diamond_metal"
android:tileMode="repeat"
android:dither="true">
</bitmap>
Run Code Online (Sandbox Code Playgroud)
我想在金属板的4个角上放置4位螺丝.
我在几个地方使用金属板,所以我更喜欢把它定义为一个可绘制的,而不是每个ocasion放置4个螺丝RelativeLayout
.
是否可以在drawable文件夹中定义XML以组合平铺金属板和4个螺钉?