AndroidのFloatingActionButton(fab)機能に感謝しており、プロジェクトのさまざまな場所で使用したいと考えています。
現在、私はこのようなものを持っています。そこでは、いくつかのxml仕様がありますが、id、アイコン、および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" />
重複コードを回避するために... xmlで指定することなく、完全にプログラムでファブを作成する方法はありますか?
.。
いくつかの提案を試してみました... SDKを現在のバージョンにアップグレードするまで「setSize」はありませんでした(#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デザインビューのような機能を使用できなくなります。そのため、操作がはるかに難しくなります。
私が考えることができる2つがあります
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);
}
詳細 インフレータ
setBackgroundTintList
および setRippleColor
を使用して、2つの属性を設定できます。
そしてそれを親に付けるためにあなたはします
layout.addView(v);
しかし、LayoutInflater
を使用すると、FloatingActionButtonの生成とその親へのアタッチの両方のタスクが実行されるため、より良いと思います。
inflater.inflate(R.layout.myfab, layout, true)
フローティングアクションボタンをより細かく制御したい場合:
クリックリスナー
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)
}
プログラムでフローティングアクションボタンを作成することができます
<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レイアウトファイルです。この親レイアウトファイル内ではなく、クラスファイルに次のコードを使用してフローティングアクションボタンを作成できます。
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);
}
}
今