我正在通过扩展来创建自定义小部件LinearLayout:
public class MyWidget extends LinearLayout {
private static Paint PAINT = new Paint(Paint.ANTI_ALIAS_FLAG);
static {
PAINT.setColor(Color.RED);
}
public MyWidget(Context context) {
this(context, null);
}
public MyWidget(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawCircle(canvas.getWidth() / 2, canvas.getHeight()/2, canvas.getWidth()/2, PAINT);
// never gets called :-(
}
@Override
protected void dispatchDraw(Canvas canvas) {
super.dispatchDraw(canvas);
// this gets called, but with a canvas sized after the padding.
}
}
Run Code Online (Sandbox Code Playgroud)
我可以添加孩子就好了,但我从来没有让我的自定义onDraw()被调用.dispatchDraw() …
我有兴趣创建一个"捕捉"到所查看项目的水平滚动视图,因此一次只显示一个项目.用户可以左/右触摸拖动并看到上一个/下一个视图,如果有足够的速度则切换到它.这种交互就像Nexus One附带的新天气/新闻小部件在其"标签"之间导航一样.
是否有任何现有的视图小部件可以执行此操作?
更新:找到了新闻/天气小部件(GenieWidget)的副本,他们似乎已经实现了自己的小部件来实现这一点,他们称之为com.google.android.apps.genie.geniewidget.ui.FlingableLinearLayout自己定制的一部分com.google.android.apps.genie.geniewidget.ui.TabView.由于该来源不可用,所以看起来并不是一个充满希望的方向.
当使用XML定义的窗口小部件布局时,各个窗口小部件实例的组件都具有相同的ID时,如何保存视图窗口小部件实例状态?
举例来说,在NumberPicker窗口小部件中使用的TimePicker窗口小部件(注意NumberPicker未暴露给SDK).这是一个简单的小部件,其中包含三个组件number_picker.xml:一个增量按钮,一个减量按钮,以及一个EditText可以直接输入数字的组件.为了使代码与这些小部件进行交互,它们都具有标识(R.id.increment,R.id.decrement和R.id.timepicker_input分别).
比方说,你有三个NumberPicker在XML布局S和你给他们不同的ID(例如R.id.hour,R.id.minute).¹那么这种布局膨胀到活动的内容视图.我们决定更改活动的方向,因此Activity.onSaveInstanceState(Bundle)有助于为具有ID的每个视图保存我们的视图状态(这是默认行为).
不幸的是,这三个NumberPicker■找EditTexts表示都有着相同的ID - R.id.timepicker_input.因此,当活动恢复时,视图层次结构中最下面的那个是其状态似乎为所有三个都保留的状态.此外,NumberPicker无论在保存时哪一个都有焦点,焦点都会转移到第一个.
TimePicker通过分别保留状态本身来解决这个问题.不幸的是,如果没有更多的工作,这将不会保留光标位置或聚焦视图.我不确定它是如何保留该状态的(如果它完全一样)(并且快速播放时间输入对话框似乎表明它可能以某种方式).
请参阅示例代码以演示此问题:https: //github.com/xxv/AndroidNumberPickerBug
¹在视图层次结构,这是设置的ID LinearLayout是NumberPicker延伸到你的ID.