例如,我有一个自定义按钮,想将其连接到SeekBar:
public class SeekBarButton extends ImageButton {
SeekBar seekBar;
public SeekBarButton(Context context) {
super(context);
}
public SeekBarButton(Context context, AttributeSet attrs) {
super(context, attrs);
}
public SeekBarButton(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public void setSeekBar(SeekBar seekBar) {
this.seekBar = seekBar;
}
public SeekBar getSeekBar() {
return seekBar;
}
}
我可以在代码中做到这一点:
sbb = (SeekBarButton) rootView.findViewById(R.id.minus_red);
sbRed = (SeekBar) rootView.findViewById(R.id.sbRed);
sbb.setSeekBar(sbRed);
但是8个按钮会提供很多样板,而我想要类似的东西:
<com.whatever.views.SeekBarButton
...
whatToPutHere:seekbar="@+id/sbRed" // like this? whatToPutHere?
android:id="@+id/minus_red" />
<SeekBar
android:id="@+id/sbRed"
... />
最简单的方法是创建一个ViewGroup
同时包含Button
和的自定义Seekbar
。如果由于某种原因您不能这样做,请使用以下解决方案:
有一些步骤可以使这项工作。首先,您必须定义一个自定义XML属性,然后可以引用和使用它。
编辑(或创建)res/values/attrs.xml
。添加:
<declare-styleable name="SeekBarButton">
<attr name="seekbarId" format="integer" />
</declare-styleable>
然后,在中SeekBarButton
,从构造函数中调用它:
private void init(Context context, AttributeSet attrs, int defStyleAttr) {
if (attrs != null) {
TypedArray a = context.obtainStyledAttributes(attrs,
R.styleable.SeekBarButton, defStyleAttr, 0);
mSeekbarId = a.getResourceId(R.styleable.SeekBarButton_seekbarId, 0);
a.recycle();
}
}
最后,在ViewGroup
布局文件的根目录中,添加
xmlns:app="http://schemas.android.com/apk/res-auto"
然后,
<com.whatever.views.SeekBarButton
android:id="@+id/minus_red"
app:seekbarId="@+id/sbRed"
... />
<SeekBar
android:id="@+id/sbRed"
... />
注意您将需要调用((ViewGroup) getParent()).findViewById(mSeekbarId)
inSeekBarButton
来实例化SeekBar
,但是getParent()
在SeekBarButton
构造函数中将为null 。因此,请延迟findViewById()
直到需要SeekBar
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句