以编程方式创建 FloatingActionButton(没有 xml)
Create FloatingActionButton programmatically (without xml)
我很欣赏 Android 的 FloatingActionButton (fab) 功能,并希望在我的项目中的许多不同地方使用它们。
现在,我有这样的东西,我有几个 xml 规格,除了 id、icon 和 onclick 之外,它们都是相同的。
<android.support.design.widget.FloatingActionButton
android:id="@+id/fabFoo"
android:onClick="onFabFoo"
android:src="@drawable/ic_foo"
app:backgroundTint="?attr/colorButtonNormal"
app2:elevation="2dp"
app:fabSize="mini"
android:focusable="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_margin="2dp"
app:rippleColor="?attr/colorSwitchThumbNormal" />
为了避免重复代码...有没有办法完全以编程方式创建 fab 而无需在 xml 中指定?
...
正在尝试一些建议...
没有 'setSize' 直到我将 SDK 升级到当前 (# 25)
FloatingActionButton fab = new FloatingActionButton(this);
fab.setId(View.generateViewId());
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("DEBUG", "onFabFoo");
}
});
fab.setImageResource(R.drawable.ic_foo);
fab.setElevation(2);
fab.setSize(android.support.design.widget.FloatingActionButton.SIZE_MINI);
fab.setFocusable(true);
RelativeLayout.LayoutParams lay = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
lay.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
lay.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
lay.setMargins(2,2,2,2);
fab.setLayoutParams(lay);
还没想好如何设置颜色
// app:backgroundTint="?attr/colorButtonNormal"
// app:rippleColor="?attr/colorSwitchThumbNormal"
我看到有设置这些的方法(setBackgroundTintList 和 setRippleColor),但我不知道如何将其设置为我在原始 xml 设置(colorButtonNormal 和 colorSwitchThumbNormal)中选择的颜色
此外,不知道如何将其附加到父级并使其显示...
好吧,我想我现在意识到,如果您以编程方式执行所有这些操作,那么您将无法使用 Android Studio 中的 xml 设计视图等功能。因此,与之合作要困难得多。
我能想到的有两个
仅使用 java
直接在代码中创建一个FloatingActionButton
,如
public FloatingActionButton getFab(Context context) {
FloatingActionButton fab = new FloatingActionButton(context);
...
return fab;
}
膨胀布局
public FloatingActionButton getFab(Context context, ViewGroup parent) {
LayoutInflater inflater = LayoutInflater.from(context);
return (FloatingActionButton) inflater.inflate(R.layout.myfab, parent, false);
}
更多关于inflater
编辑:
您可以使用setBackgroundTintList
and setRippleColor
设置2个属性。
并将其附加到 parent 你做
layout.addView(v);
但我觉得使用 LayoutInflater
更好,因为它既可以生成 FloatingActionButton 又可以将其附加到 parent。
inflater.inflate(R.layout.myfab, layout, true)
我们可以通过编程实现创建一个浮动按钮
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/my_relative_layout">
</RelativeLayout>
这是主要的 xml 布局文件
不在这个父布局文件中,我们可以在 class 文件中使用以下代码创建浮动操作按钮。
public class MyClass extends AppCompatActivity{
RelativeLayout relativeLayout;
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_name);
relativeLayout = (RelativeLayout) findViewByID(R.id.my_relative_layout);
FloatingActionButton fab = new FloatingActionButton(getContext());
fab.setId(R.id.fab_location_main);
fab.setLayoutParams(new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.WRAP_CONTENT,
RelativeLayout.LayoutParams.WRAP_CONTENT
));
relativeLayout.addView(fab);
}
}
现在
对于高级用户
如果您想更好地控制 FLoating 操作按钮:
- 保证金,
- 填充,
- 旋转
- 约束集
- 色调
- 可绘制
点击监听器
private fun addFabButton() {
// tint color from theme
val typedValue = TypedValue()
context.theme.resolveAttribute(R.attr.drawer_fab_tint, typedValue, true)
@ColorInt val tintColor = typedValue.data
val pillView = FloatingActionButton(context)
pillView.run {
id = View.generateViewId() // set ID
scaleType = ImageView.ScaleType.FIT_XY // scale Type
setImageResource(R.drawable.ic_toolkit_arrow_left_auto_mirror) // UI LIb icon
setColorFilter(tintColor) // tint color based on theme
setOnClickListener { v: View ->
//Handle Click
}
}
parentView.addView(pillView)
// --------Set Height, Width & padding --------
val params = pillView.layoutParams
// convert dp to pixels
params.height = context.resources.getDimensionPixelSize(R.dimen.fab_icon_height)
params.width = context.resources.getDimensionPixelSize(R.dimen.fab_icon_width)
pillView.layoutParams = params
val padding = context.resources.getDimensionPixelSize(com.bmwgroup.idnext.keyboard.R.dimen.hide_key_padding)
pillView.setPadding(padding,padding,padding,padding)
pillView.requestLayout()
pillView.rotation = -90f
// --------Apply Constraint set-------
val set = ConstraintSet()
set.clone(view)
// Left Constraint
val marginStart = context.resources.getDimensionPixelSize(com.bmwgroup.idnext.keyboard.R.dimen.hide_key_margin_start)
set.connect(pillView.id,ConstraintSet.LEFT,ConstraintSet.PARENT_ID,ConstraintSet.LEFT,
marginStart
)
// top Constraint
set.connect(pillView.id,ConstraintSet.TOP,ConstraintSet.PARENT_ID,ConstraintSet.TOP,0)
set.applyTo(view)
}
我很欣赏 Android 的 FloatingActionButton (fab) 功能,并希望在我的项目中的许多不同地方使用它们。
现在,我有这样的东西,我有几个 xml 规格,除了 id、icon 和 onclick 之外,它们都是相同的。
<android.support.design.widget.FloatingActionButton
android:id="@+id/fabFoo"
android:onClick="onFabFoo"
android:src="@drawable/ic_foo"
app:backgroundTint="?attr/colorButtonNormal"
app2:elevation="2dp"
app:fabSize="mini"
android:focusable="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_margin="2dp"
app:rippleColor="?attr/colorSwitchThumbNormal" />
为了避免重复代码...有没有办法完全以编程方式创建 fab 而无需在 xml 中指定?
...
正在尝试一些建议... 没有 'setSize' 直到我将 SDK 升级到当前 (# 25)
FloatingActionButton fab = new FloatingActionButton(this);
fab.setId(View.generateViewId());
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("DEBUG", "onFabFoo");
}
});
fab.setImageResource(R.drawable.ic_foo);
fab.setElevation(2);
fab.setSize(android.support.design.widget.FloatingActionButton.SIZE_MINI);
fab.setFocusable(true);
RelativeLayout.LayoutParams lay = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
lay.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
lay.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
lay.setMargins(2,2,2,2);
fab.setLayoutParams(lay);
还没想好如何设置颜色
// app:backgroundTint="?attr/colorButtonNormal"
// app:rippleColor="?attr/colorSwitchThumbNormal"
我看到有设置这些的方法(setBackgroundTintList 和 setRippleColor),但我不知道如何将其设置为我在原始 xml 设置(colorButtonNormal 和 colorSwitchThumbNormal)中选择的颜色
此外,不知道如何将其附加到父级并使其显示...
好吧,我想我现在意识到,如果您以编程方式执行所有这些操作,那么您将无法使用 Android Studio 中的 xml 设计视图等功能。因此,与之合作要困难得多。
我能想到的有两个
仅使用 java
直接在代码中创建一个FloatingActionButton
,如
public FloatingActionButton getFab(Context context) {
FloatingActionButton fab = new FloatingActionButton(context);
...
return fab;
}
膨胀布局
public FloatingActionButton getFab(Context context, ViewGroup parent) {
LayoutInflater inflater = LayoutInflater.from(context);
return (FloatingActionButton) inflater.inflate(R.layout.myfab, parent, false);
}
更多关于inflater
编辑:
您可以使用setBackgroundTintList
and setRippleColor
设置2个属性。
并将其附加到 parent 你做
layout.addView(v);
但我觉得使用 LayoutInflater
更好,因为它既可以生成 FloatingActionButton 又可以将其附加到 parent。
inflater.inflate(R.layout.myfab, layout, true)
我们可以通过编程实现创建一个浮动按钮
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/my_relative_layout">
</RelativeLayout>
这是主要的 xml 布局文件 不在这个父布局文件中,我们可以在 class 文件中使用以下代码创建浮动操作按钮。
public class MyClass extends AppCompatActivity{
RelativeLayout relativeLayout;
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_name);
relativeLayout = (RelativeLayout) findViewByID(R.id.my_relative_layout);
FloatingActionButton fab = new FloatingActionButton(getContext());
fab.setId(R.id.fab_location_main);
fab.setLayoutParams(new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.WRAP_CONTENT,
RelativeLayout.LayoutParams.WRAP_CONTENT
));
relativeLayout.addView(fab);
}
}
现在
对于高级用户
如果您想更好地控制 FLoating 操作按钮:
- 保证金,
- 填充,
- 旋转
- 约束集
- 色调
- 可绘制
点击监听器
private fun addFabButton() { // tint color from theme val typedValue = TypedValue() context.theme.resolveAttribute(R.attr.drawer_fab_tint, typedValue, true) @ColorInt val tintColor = typedValue.data val pillView = FloatingActionButton(context) pillView.run { id = View.generateViewId() // set ID scaleType = ImageView.ScaleType.FIT_XY // scale Type setImageResource(R.drawable.ic_toolkit_arrow_left_auto_mirror) // UI LIb icon setColorFilter(tintColor) // tint color based on theme setOnClickListener { v: View -> //Handle Click } } parentView.addView(pillView) // --------Set Height, Width & padding -------- val params = pillView.layoutParams // convert dp to pixels params.height = context.resources.getDimensionPixelSize(R.dimen.fab_icon_height) params.width = context.resources.getDimensionPixelSize(R.dimen.fab_icon_width) pillView.layoutParams = params val padding = context.resources.getDimensionPixelSize(com.bmwgroup.idnext.keyboard.R.dimen.hide_key_padding) pillView.setPadding(padding,padding,padding,padding) pillView.requestLayout() pillView.rotation = -90f // --------Apply Constraint set------- val set = ConstraintSet() set.clone(view) // Left Constraint val marginStart = context.resources.getDimensionPixelSize(com.bmwgroup.idnext.keyboard.R.dimen.hide_key_margin_start) set.connect(pillView.id,ConstraintSet.LEFT,ConstraintSet.PARENT_ID,ConstraintSet.LEFT, marginStart ) // top Constraint set.connect(pillView.id,ConstraintSet.TOP,ConstraintSet.PARENT_ID,ConstraintSet.TOP,0) set.applyTo(view) }