以编程方式创建FloatingActionButton(不带xml)

时间:2017-03-06 19:34:33

标签: android xml inheritance floating-action-button

我很欣赏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" />

为了避免重复代码...有没有办法以编程方式完全创建工厂而无需在xml中指定它?

...

尝试一些建议...... 没有&#39; setSize&#39;直到我将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);

Haven还没弄明白如何设置颜色

//  app:backgroundTint="?attr/colorButtonNormal"
//  app:rippleColor="?attr/colorSwitchThumbNormal"

我看到有设置这些的方法(setBackgroundTintList和setRippleColor),但我不知道如何将它设置为我在原始xml设置中选择的颜色(colorButtonNormal和colorSwitchThumbNormal)

另外,不知道如何将它附加到父母并让它显示...

好吧,我想我现在意识到,如果你以编程方式完成所有这些操作,那么你就无法使用Android Studio中的xml Design视图等功能。因此,使用起来要困难得多。

3 个答案:

答案 0 :(得分:4)

有两个我能想到的

仅使用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

的更多信息

编辑:

您可以使用setBackgroundTintListsetRippleColor来设置2个属性。

并将其附加到父母身上

layout.addView(v);

但我觉得使用LayoutInflater更好,因为它完成了生成FloatingActionButton并将其附加到其父级的任务。

inflater.inflate(R.layout.myfab, layout, true)

答案 1 :(得分:0)

我们可以通过编程方式创建一个浮动操作按钮

<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);
    }
}

现在

答案 2 :(得分:0)

对于高级用户

如果您想进一步控制“浮动操作”按钮:

  • 保证金,
  • 填充
  • 旋转
  • 约束集
  • 色调
  • 可绘制
  • 点击监听器

    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)
    
    }