Coder Social home page Coder Social logo

fab-speed-dial's People

Contributors

alanjcaceres avatar dstd avatar i906 avatar leonardo2204 avatar liaohuqiu avatar nonproto avatar paour avatar yavski avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

fab-speed-dial's Issues

How to change icon fabspeed dial primary icon "+" ?

Hi yavski ,
First of all, Thank you for this awesome library.
Is there any way to change the button icon in fabspeeddial - "+" (Need to replace the "+" with custom)

android:src="@drawable/reload" - Not working

Prefix custom attributes

Id' recommend prefixing all custom attributes with i.e. fsd_ or anything like that to avoid potential clash with other libraries in the project.

touchGuard intercept fabMenu's touch event

In click callback sample, i am noticing that i always need to double click the fabMenuItem to show the snackbar. The first click was intercepted by touchGuard.
My OS : Android 6.0.1, CM13.1
AndroidStudio:2.2.2

Can neither listen to click events of the FAB nor change anything programmatically

None of the following method calls seem to take effect.

FloatingActionButton fabSpeedDialFab = (FloatingActionButton) findViewById(io.github.yavski.fabmenu.R.id.fab);

fabSpeedDialFab.setImageDrawable( ... );
fabSpeedDialFab.setBackgroundTintList( ... );
fabSpeedDialFab.setOnClickListener( ... );

However calling

fabSpeedDialFab.setVisibility( View.GONE );

works and the whole FAB + Speed Dial is invisible.

Set alpha on the background

I'd like to set the alpha when menu is open like this
Edit
The container of the Fab is a CoordinatorLayout, not a FrameLayout, how can I do? Thanks.

Change fabBackgoundTint programmatically

Hello, is there way, how to change fabBackgroundTint programmatically from code? When I tried this:
fabSpeedDial.setBackgroundColor(getResources().getColor(R.color.colorSecond));
it filled big square behind fab, but fab itself stayed original color...
What should I do?

Detect main fab press

Hello, I just want to ask, if there is a way how to detect main floating action button... I have in my drawable folder white transparent background and I want to display it, when that button is clicked.

I tryed this:
android:onClick="fab_menu_clicked"
but it didn't work...

What should I do?

FAB menu added twice in some cases after an orientation change

I am able to reproduce this issue by adding a LinearLayout view:

<?xml version="1.0" encoding="utf-8"?><!--
  ~ Copyright 2016 Yavor Ivanov
  ~
  ~ Licensed under the Apache License, Version 2.0 (the "License");
  ~ you may not use this file except in compliance with the License.
  ~ You may obtain a copy of the License at
  ~
  ~     http://www.apache.org/licenses/LICENSE-2.0
  ~
  ~ Unless required by applicable law or agreed to in writing, software
  ~ distributed under the License is distributed on an "AS IS" BASIS,
  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  ~ See the License for the specific language governing permissions and
  ~ limitations under the License.
  -->
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/rootView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:context="io.github.yavski.fabspeeddial.samples.PositionSampleActivity">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:popupTheme="@style/AppTheme.PopupOverlay" />

    </android.support.design.widget.AppBarLayout>

    <FrameLayout
        android:id="@+id/content_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginTop="?attr/actionBarSize">

        <io.github.yavski.fabspeeddial.FabSpeedDial
            android:id="@+id/position_bottom_end"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom|end"
            app:fabGravity="bottom_end"
            app:fabMenu="@menu/menu_main"
            app:touchGuard="false" />

        <io.github.yavski.fabspeeddial.FabSpeedDial
            android:id="@+id/position_bottom_start"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom|start"
            app:fabGravity="bottom_start"
            app:fabMenu="@menu/menu_main"
            app:touchGuard="false" />

        <io.github.yavski.fabspeeddial.FabSpeedDial
            android:id="@+id/position_top_start"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="top|start"
            app:fabGravity="top_start"
            app:fabMenu="@menu/menu_main"
            app:touchGuard="false" />

        <io.github.yavski.fabspeeddial.FabSpeedDial
            android:id="@+id/position_top_end"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="top|end"
            app:fabGravity="top_end"
            app:fabMenu="@menu/menu_main"
            app:touchGuard="true" />

        <LinearLayout
            android:layout_width="match_parent"
            android:id="@+id/test_layout"
            android:visibility="gone"
            android:layout_height="match_parent"
            android:orientation="vertical"/>

    </FrameLayout>

</android.support.design.widget.CoordinatorLayout>

to the bottom of the FrameLayout used in your activity_position_sample layout/demo app.

Screenshot:
screenshot_1477413438

As far as the code responsible for this bug, I am noticing that in this case, the FAB menu items are added to the menuItemsLayout twice. onAttachedToWindow is called twice, and no checks are done to ensure we are not re-adding items that are already present. I'm not sure why the existence of an extra LinearLayout would cause this to happen, but there are certain use cases where the FAB is not the top most item (an example: I want to display help/onboarding views which cover the entire screen with a semi-transparent view with info/details)

Trying to start CircularReveal animation got Runtime error: "Cannot start this animator on a detached view"

It may be not really an issue of fab-speed-dial, just I did it the wrong way...

I had been trying to implement a speed-dial Play button on Kore:
xbmc/Kore#301 (comment)
then run into Runtime error: "Cannot start this animator on a detached view" .
In short, if a speed-dial menu item action trigger CircularReveal animation, it causes runtime error, ex:

 FabSpeedDial fabSpeedDial = (FabSpeedDial) findViewById(R.id.fab_speed_dial);
        fabSpeedDial.setMenuListener(new SimpleMenuListenerAdapter() {
            @Override
            public boolean onMenuItemSelected(MenuItem menuItem) {
                 switch (menuItem.getItemId()) {
                        case R.id.play_on_osmc:
                         //exitTransitionView is a hidden view that has already been inflated.
                        // Runtime Error here!!!
                         ViewAnimationUtils.createCircularReveal(exitTransitionView, centerX, centerY, 0, endRadius); 
                          break;
                   }
            }
        });

Any Idea?
Please let me know if more information is needed. I can also create a simple example app to reproduce the Runtime error.

How to hide activity's fab-speed-dial in child fragment?

I have a Main Activity which contains a fab-speed-dial, and I am using NavigationDrawer swich fragments. When I replace to another fragment, I want hide fab-speed-dial, I tried implements this in MainActivity:

 FabSpeedDial mainFab;

...
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar_news_detail);
        setSupportActionBar(toolbar);
        getSupportActionBar().setTitle("Hot");
        if (savedInstanceState == null) {
            getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new HotFragment()).commit();
        }

        //get the fab in main
        FabSpeedDial mainFab = (FabSpeedDial) findViewById(R.id.fab_main);
        if (mainFab == null){
            System.out.println("If main fab is null, this will show.");
        }

        //实现drawer布局
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.setDrawerListener(new DrawerLayout.DrawerListener() {
            @Override
            public void onDrawerSlide(View drawerView, float slideOffset) {
                //设置drawer里面的圆形图片,这貌似是添加原型图片最简单的办法
                ImageView imageViewPortrait = (ImageView) findViewById(R.id.navImageView);
                Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.portrait);
                RoundedBitmapDrawable dr = RoundedBitmapDrawableFactory.create(getResources(), bitmap);
                dr.setCircular(true);
                imageViewPortrait.setImageDrawable(dr);
            }
            @Override
            public void onDrawerOpened(View drawerView) {
            }
            @Override
            public void onDrawerClosed(View drawerView) {
            }
            @Override
            public void onDrawerStateChanged(int newState) {
            }
        });
        toggle.syncState();

        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
        //设置默认的选中nav item
        navigationView.setCheckedItem(R.id.nav_hot);
        navigationView.setNavigationItemSelectedListener(this);

    }
...
public void showFabMain(){
        mainFab.show();
    }
public void hideFabMain(){
        mainFab.hide();
    }

and in fragment I called hideFabMain( ) method:

//get father activity floating button set it too invisible
((MainActivity) getActivity()).hideFabMain();

However, I got a NULL pointer error:

java.lang.NullPointerException: Attempt to invoke virtual method 'void io.github.yavski.fabspeeddial.FabSpeedDial.hide()' on a null object reference
                                                                          at com.ouman.luoliluoli.MainActivity.hideFabMain(MainActivity.java:163)
                                                                          at com.ouman.luoliluoli.AroundFragment.onCreateView(AroundFragment.java:48)
                                                                          at android.support.v4.app.Fragment.performCreateView(Fragment.java:2087)
                                                                          at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1113)
                                                                          at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1295)
                                                                          at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:801)
                                                                          at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1682)
                                                                          at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:541)
                                                                          at android.os.Handler.handleCallback(Handler.java:751)
                                                                          at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                          at android.os.Looper.loop(Looper.java:154)
                                                                          at android.app.ActivityThread.main(ActivityThread.java:6119)
                                                                          at java.lang.reflect.Method.invoke(Native Method)
                                                                          at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
                                                                          at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

So, I want get some help in my question, this really struggled me out, the great author can give me some advise?

Not working on Honeycomb

Menu items not showing in Honeycomb (API 11). FAB button is working but menu items not visible

fabSpeedDial.show(); don't work

Hi

I implemented your lib today to replace my floatingActionButton.
I set your FabSpeedDial with visibility setted as "gone" in my xml but when I call fabSpeedDial.show();, it simply doesn't work.
I does with the original fab.

Why do you check "if (!ViewCompat.isAttachedToWindow(this))" ?

thank you for your work

Error inflating class io.github.yavski.fabspeeddial.FabSpeedDial

Hi, Below is the XML:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    >

    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="16dp">

        <io.github.yavski.fabspeeddial.FabSpeedDial
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom|end"
            app:fabGravity="bottom_end"
            app:fabMenu="@menu/menu_main"
            app:miniFabBackgroundTint="@android:color/white"
            app:miniFabDrawableTint="?attr/colorPrimaryDark"
            app:miniFabTitleTextColor="?attr/colorPrimaryDark" />

    </FrameLayout>

</RelativeLayout>

Detect when no one of items selected

Hello, I just want to ask, if there is a way how to detect when no one of all items is clicked (or when is clicked on screen completly away from fab-speed-dial)

I want to disappear white transparent from screen...

What should I do? :)

Crash when using id "fab"

When using the attribute android:id="@+id/fab" on a FabSpeedDial element, the app won't compile:

java.lang.ClassCastException: io.github.yavski.fabspeeddial.FabSpeedDial cannot be cast to android.support.design.widget.FloatingActionButton
at io.github.yavski.fabspeeddial.FabSpeedDial.onAttachedToWindow(FabSpeedDial.java:239)

At least this should be mentioned somewhere.

Is it possible to close the FabMenuItems with code?

I need to close the FabMenu before I start a fragment transition because it messes with the collapse animation I have.

Is there anyway to do this already? Or could you make a method that I can call after finding the FabSpeedDial by id?

Error inflating class io.github.yavski.fabspeeddial.FabSpeedDial

Hello, I'm getting this error that I can't resolve:

Menu resource:
< menu xmlns:android="http://schemas.android.com/apk/res/android" > < item android:id="@+id/action_bookmark" android:icon="@drawable/bookmark" android:title="New bookmark" / > < item android:id="@+id/action_suggestions" android:icon="@drawable/suggestions" android:title="Suggestions"/ > < item android:id="@+id/action_folder" android:icon="@drawable/newfolder" android:title="New folder" / > < /menu >

Layout XML:
<io.github.yavski.fabspeeddial.FabSpeedDial android:id="@+id/readsaved_fabspeeddial" android:layout_width="wrap_content" android:layout_height="wrap_content" app:backgroundTint="#ffffffff" app:fabMenu="@menu/fsd_all" app:miniFabBackgroundTint="#ffffffff" app:miniFabDrawableTint="@color/ColorPrimaryDark" app:miniFabTitleTextColor="@color/ColorPrimaryDark" app:fabGravity="bottom_end" android:layout_alignParentBottom="true" android:layout_alignParentRight="true" android:layout_alignParentEnd="true" app:fabBackgroundTint= "@color/ColorPrimaryDark"/>

Java implementation:
`FabSpeedDial fabSpeedDial = (FabSpeedDial) findViewById(R.id.readsaved_fabspeeddial);
fabSpeedDial.setMenuListener(new SimpleMenuListenerAdapter() {
@OverRide
public boolean onMenuItemSelected(MenuItem menuItem) {
int id = menuItem.getItemId();

            if (id== R.id.action_bookmark){
              ...
            } else if (id == R.id.action_suggestions){
               ...
            }
            return true;
        }
    });`

Stack trace:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.gcappslab.gcorso.letsbookmark/com.gcappslab.gcorso.letsbookmark.Activities.AllSitesActivity}: android.view.InflateException: Binary XML file line #19: Binary XML file line #19: Error inflating class io.github.yavski.fabspeeddial.FabSpeedDial at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) at android.app.ActivityThread.-wrap11(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5417) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) Caused by: android.view.InflateException: Binary XML file line #19: Binary XML file line #19: Error inflating class io.github.yavski.fabspeeddial.FabSpeedDial at android.view.LayoutInflater.inflate(LayoutInflater.java:539) at android.view.LayoutInflater.inflate(LayoutInflater.java:423) at android.view.LayoutInflater.inflate(LayoutInflater.java:374) at android.support.v7.app.AppCompatDelegateImplV9.setContentView(AppCompatDelegateImplV9.java:288) at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:143) at com.gcappslab.gcorso.letsbookmark.Activities.AllSitesActivity.onCreate(AllSitesActivity.java:76) at android.app.Activity.performCreate(Activity.java:6251) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)  at android.app.ActivityThread.-wrap11(ActivityThread.java)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)  at android.os.Handler.dispatchMessage(Handler.java:102)  at android.os.Looper.loop(Looper.java:148)  at android.app.ActivityThread.main(ActivityThread.java:5417)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)  Caused by: android.view.InflateException: Binary XML file line #19: Error inflating class io.github.yavski.fabspeeddial.FabSpeedDial at android.view.LayoutInflater.createView(LayoutInflater.java:645) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:764) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704) at android.view.LayoutInflater.rInflate(LayoutInflater.java:835) at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798) at android.view.LayoutInflater.inflate(LayoutInflater.java:515) at android.view.LayoutInflater.inflate(LayoutInflater.java:423)  at android.view.LayoutInflater.inflate(LayoutInflater.java:374)  at android.support.v7.app.AppCompatDelegateImplV9.setContentView(AppCompatDelegateImplV9.java:288)  at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:143)  at com.gcappslab.gcorso.letsbookmark.Activities.AllSitesActivity.onCreate(AllSitesActivity.java:76)  at android.app.Activity.performCreate(Activity.java:6251)  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)  at android.app.ActivityThread.-wrap11(ActivityThread.java)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)  at android.os.Handler.dispatchMessage(Handler.java:102)  at android.os.Looper.loop(Looper.java:148)  at android.app.ActivityThread.main(ActivityThread.java:5417)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)  Caused by: java.lang.reflect.InvocationTargetException at java.lang.reflect.Constructor.newInstance(Native Method) at android.view.LayoutInflater.createView(LayoutInflater.java:619) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:764)  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)  at android.view.LayoutInflater.rInflate(LayoutInflater.java:835)  at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798)  at android.view.LayoutInflater.inflate(LayoutInflater.java:515)  at android.view.LayoutInflater.inflate(LayoutInflater.java:423)  at android.view.LayoutInflater.inflate(LayoutInflater.java:374)  at android.support.v7.app.AppCompatDelegateImplV9.setContentView(AppCompatDelegateImplV9.java:288)  at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:143)  at com.gcappslab.gcorso.letsbookmark.Activities.AllSitesActivity.onCreate(AllSitesActivity.java:76)  at android.app.Activity.performCreate(Activity.java:6251)  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)  at android.app.ActivityThread.-wrap11(ActivityThread.java)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)  at android.os.Handler.dispatchMessage(Handler.java:102)  at android.os.Looper.loop(Looper.java:148)  at android.app.ActivityThread.main(ActivityThread.java:5417)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)  Caused by: android.view.InflateException: Binary XML file line #27: Binary XML file line #27: Error inflating class android.support.design.widget.FloatingActionButton at android.view.LayoutInflater.inflate(LayoutInflater.java:539) at android.view.LayoutInflater.inflate(LayoutInflater.java:423) at io.github.yavski.fabspeeddial.FabSpeedDial.init(FabSpeedDial.java:156) at io.github.yavski.fabspeeddial.FabSpeedDial.<init>(FabSpeedDial.java:140) at java.lang.reflect.Constructor.newInstance(Native Method)  at android.view.LayoutInflater.createView(LayoutInflater.java:619)  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:764)  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)  at android.view.LayoutInflater.rInflate(LayoutInflater.java:835)  at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798)  at android.view.LayoutInflater.inflate(LayoutInflater.java:515)  at android.view.LayoutInflater.inflate(LayoutInflater.java:423)  at android.view.LayoutInflater.inflate(LayoutInflater.java:374)  at android.support.v7.app.AppCompatDelegateImplV9.setContentView(AppCompatDelegateImplV9.java:288)  at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:143)  at com.gcappslab.gcorso.letsbookmark.Activities.AllSitesActivity.onCreate(AllSitesActivity.java:76)  at android.app.Activity.performCreate(Activity.java:6251)  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)  at android.app.ActivityThread.-wrap11(ActivityThread.java)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)  at android.os.Handler.dispatchMessage(Handler.java:102)  at android.os.Looper.loop(Looper.java:148)  at android.app.ActivityThread.main(ActivityThread.java:5417)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)  Caused by: android.view.InflateException: Binary XML file line #27: Error inflating class android.support.design.widget.FloatingActionButton at android.view.LayoutInflater.createView(LayoutInflater.java:645) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:764) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704) at android.view.LayoutInflater.rInflate(LayoutInflater.java:835) at android.view.LayoutInflater.inflate(LayoutInflater.java:489) at android.view.LayoutInflater.inflate(LayoutInflater.java:423)  at io.github.yavski.fabspeeddial.FabSpeedDial.init(FabSpeedDial.java:156)  at io.github.yavski.fabspeeddial.FabSpeedDial.<init>(FabSpeedDial.java:140)  at java.lang.reflect.Constructor.newInstance(Native Method)  at android.view.LayoutInflater.createView(LayoutInflater.java:619)  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:764)  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)  at android.view.LayoutInflater.rInflate(LayoutInflater.java:835)  at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798)  at android.view.LayoutInflater.inflate(LayoutInflater.java:515)  at android.view.LayoutInflater.inflate(LayoutInflater.java:423)  at android.view.LayoutInflater.inflate(LayoutInflater.java:374)  at android.support.v7.app.AppCompatDelegateImplV9.setContentView(AppCompatDelegateImplV9.java:288)  at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:143)  at com.gcappslab.gcorso.letsbookmark.Activities.AllSitesActivity.onCreate(AllSitesActivity.java:76)  at android.app.Activity.performCreate(Activity.java:6251)  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)  at android.app.ActivityThread.-wrap11(ActivityThread.java)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)  at android.os.Handler.dispatchMessage(Handler.java:102)  at android.os.Looper.loop(Looper.java:148)  at android.app.ActivityThread.main(ActivityThread.java:5417)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)  Caused by: java.lang.reflect.InvocationTargetException at java.lang.reflect.Constructor.newInstance(Native Method) at android.view.LayoutInflater.createView(LayoutInflater.java:619) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:764)  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)  at android.view.LayoutInflater.rInflate(LayoutInflater.java:835)  at android.view.LayoutInflater.inflate(LayoutInflater.java:489)  at android.view.LayoutInflater.inflate(LayoutInflater.java:423)  at io.github.yavski.fabspeeddial.FabSpeedDial.init(FabSpeedDial.java:156)  at io.github.yavski.fabspeeddial.FabSpeedDial.<init>(FabSpeedDial.java:140)  at java.lang.reflect.Constructor.newInstance(Native Method)  at android.view.LayoutInflater.createView(LayoutInflater.java:619)  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:764)  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)  at android.view.LayoutInflater.rInflate(LayoutInflater.java:835)  at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798)  at android.view.LayoutInflater.inflate(LayoutInflater.java:515)  at android.view.LayoutInflater.inflate(LayoutInflater.java:423)  at android.view.LayoutInflater.inflate(LayoutInflater.java:374)  at android.support.v7.app.AppCompatDelegateImplV9.setContentView(AppCompatDelegateImplV9.java:288)  at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:143)  at com.gcappslab.gcorso.letsbookmark.Activities.AllSitesActivity.onCreate(AllSitesActivity.java:76)  at android.app.Activity.performCreate(Activity.java:6251)  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)  at android.app.ActivityThread.-wrap11(ActivityThread.java)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)  at android.os.Handler.dispatchMessage(Handler.java:102)  at android.os.Looper.loop(Looper.java:148)  at android.app.ActivityThread.main(ActivityThread.java:5417)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)  Caused by: java.lang.NoSuchMethodError: No direct method <init>(Landroid/widget/ImageView;Landroid/support/v7/widget/AppCompatDrawableManager;)V in class Landroid/support/v7/widget/AppCompatImageHelper; or its super classes (declaration of 'android.support.v7.widget.AppCompatImageHelper'

I tried to add Android Design Support Library to my project but it didn't work. Is there anyone that can help me? Thanks in advance.

java.lang.NoSuchFieldError: No static field fab

this is my logcat file:

java.lang.NoSuchFieldError: No static field fab of type I in class Lio/github/yavski/fabmenu/R$id; or its superclasses (declaration of 'io.github.yavski.fabmenu.R$id' appears in /data/app/com.v.g.capp-2/base.apk)
at io.github.yavski.fabspeeddial.FabSpeedDial.onAttachedToWindow(FabSpeedDial.java:266)

why? what does it means?

Fab between header and "card view" don't work...

I'm using floating action menu from yavski library and I tried to place it between 2 layout just like in this question:
It worked with normal fab, but when I did it with fab - menu from yavski library, it didn't work...

I'm adding the button between header and "cardview"(link).

Image1

When I slide down in this and I use default library for fab, it works well (Button disappear and appear when slide up). But when I use the special one, it at start looks good, but when i slide down, instead of disappearing it slides down too...

Image2

And the last problem is, that when the button is clicked, it moves a bit upwards...

Image3

What should I do?

1.0.7 regression: Menu items won't be selected when contained in RelativeLayout

<layout>
    <RelativeLayout>
        <io.github.yavski.fabspeeddial.FabSpeedDial
            android:id="@+id/fabSpeedDial"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_alignParentEnd="true"

            app:fabGravity="bottom_end"
            app:fabMenu="@menu/fab_device_history"
            app:miniFabTitleTextColorList="@array/fab_menu_item_colors"
            app:miniFabBackgroundTintList="@array/fab_menu_item_colors"
            app:miniFabDrawableTint="@color/white"
            app:fabBackgroundTint="@color/fabDeviceHistory"
            app:miniFabTitleTextColor="@color/colorPrimaryText"/>

    </RelativeLayout>
</binding>
        binding.fabSpeedDial.setMenuListener(new SimpleMenuListenerAdapter() {
            @Override
            public boolean onMenuItemSelected(MenuItem menuItem) {
                // Will never be called.
            }
        }

Rendering issue on Android 6.0

The following layout:

<RelativeLayout
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <io.github.yavski.fabspeeddial.FabSpeedDial
        android:id="@+id/main_activity_fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"
        app:miniFabBackgroundTint="@android:color/white"
        app:miniFabDrawableTint="@color/colorPrimary"
        app:miniFabTitleBackgroundTint="@color/white"
        app:miniFabTitleTextColor="@color/mahogany"
        app:fabBackgroundTint="@color/colorPrimary"
        app:touchGuard="false"
        app:fabGravity="bottom_end"
        app:fabMenu="@menu/menu_main"/>

       ...
</RelativeLayout>

Produces:
captura de pantalla 2017-01-29 a las 01 14 39

The top part of the first miniFAB is not visible. Tested on Emulator and a physical device (Nexus 5)

Thank you So much YavSki

Library Worked Perfectly

Here's my sample code on How it worked for me

FabSpeedDial fabSpeedDial = (FabSpeedDial) getActivity().findViewById(R.id.fab_speed_dial);
        fabSpeedDial.setMenuListener(new SimpleMenuListenerAdapter() {
            @Override
            public boolean onMenuItemSelected(MenuItem menuItem) {
                int itemId = menuItem.getItemId();
                switch (itemId) {
                    case R.id.action_copy:
                        ...
                        break;
                    case R.id.action_save:
                       ...
                        break;
                    case R.id.action_clear:
                       ...
                        break;
                }
                return true;
            }
        });

Thanks @yavski !

When a second FAB is added, the first one stops working properly

I'm about to finish the first release of a geo-location API and make it public here on github. So, for example purposes, I'm implementing an app that use it too. I have a map fragment where user can save points of interests and see them on the map or on a list. Problem is, I need two different FABs on map screen: one for some functionalities and another to change map type. After I added the second fab, first one does not show the icon anymore neither open the options. Below follows an screenshot of the problem:

image

I have these menu.xml options for each one:

fab_map_add_options.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/ic_save_current_location"
        android:icon="@mipmap/ic_add_poi"
        android:title="@string/nav_add_poi"/>
    <item
        android:id="@+id/ic_goto_my_position"
        android:icon="@mipmap/ic_goto_my_location"
        android:title="@string/fab_goto_my_position" />
</menu>

fab_map_types_options.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/ic_change_map_to_satellite"
        android:icon="@mipmap/ic_add_poi"
        android:title="@string/map_satellite_type"/>
    <item
        android:id="@+id/ic_change_map_to_terrain"
        android:icon="@mipmap/ic_goto_my_location"
        android:title="@string/map_terrain_type" />
    <item
        android:id="@+id/ic_change_map_to_normal"
        android:icon="@mipmap/ic_goto_my_location"
        android:title="@string/map_normal_type" />
</menu>

map_fragment.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:app="http://schemas.android.com/apk/res-auto"
                android:id="@+id/map_fragment"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical">

    <fragment xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:tools="http://schemas.android.com/tools"
              android:id="@+id/map"
              android:name="com.google.android.gms.maps.SupportMapFragment"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              tools:context="locationmanager.jgeraldo.com.androidlocationmanager.ui.fragments.MapsFragment"/>


    <io.github.yavski.fabspeeddial.FabSpeedDial
        android:id="@+id/fab_map_type_options"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_gravity="bottom|start"
        app:fabDrawable="@mipmap/ic_change_map_type"
        app:fabDrawableTint="@color/icons_n_texts"
        app:fabGravity="bottom_start"
        app:fabMenu="@menu/fab_map_types_options"
        app:miniFabBackgroundTint="@color/colorPrimary"
        app:miniFabDrawableTint="@color/icons_n_texts"
        app:miniFabTitleBackgroundTint="@color/colorPrimary"
        app:miniFabTitleTextColor="@color/icons_n_texts"/>


    <io.github.yavski.fabspeeddial.FabSpeedDial
        android:id="@+id/fab_map_add_options"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:layout_gravity="bottom|end"
        app:fabDrawable="@mipmap/ic_add"
        app:fabDrawableTint="@color/icons_n_texts"
        app:fabGravity="bottom_end"
        app:fabMenu="@menu/fab_map_add_options"
        app:miniFabBackgroundTint="@color/colorPrimary"
        app:miniFabDrawableTint="@color/icons_n_texts"
        app:miniFabTitleBackgroundTint="@color/colorPrimary"
        app:miniFabTitleTextColor="@color/icons_n_texts"/>
</RelativeLayout>

And on MapFragment:

        mFabAdd = (FabSpeedDial) view.findViewById(R.id.fab_map_add_options);
        mFabAdd.setMenuListener(new SimpleMenuListenerAdapter() {
            @Override
            public boolean onMenuItemSelected(MenuItem menuItem) {
                int itemId = menuItem.getItemId();

                if (itemId == R.id.ic_save_current_location) {
                    openNewLocationNameChoosingDialog();
                    return true;
                } else if (itemId == R.id.ic_goto_my_position) {
                    if (!Preferences.getLocationPermissionsGrantFlag(mContext)) {
                        Util.checkLocationPermissions(mActivity);
                    } else {
                        new GetCurrentCoordinates().execute();
                    }
                    return true;
                }
                return false;
            }
        });

        mFabTypes = (FabSpeedDial) view.findViewById(R.id.fab_map_type_options);
        mFabTypes.setMenuListener(new SimpleMenuListenerAdapter() {
            @Override
            public boolean onMenuItemSelected(MenuItem menuItem) {
                int itemId = menuItem.getItemId();

                int map_type
                    ;

                if (itemId == R.id.ic_change_map_to_normal) {
                    map_type = GoogleMap.MAP_TYPE_NORMAL;
                } else if (itemId == R.id.ic_change_map_to_terrain) {
                    map_type = GoogleMap.MAP_TYPE_TERRAIN;
                } else {
                    map_type = GoogleMap.MAP_TYPE_SATELLITE;
                }

                mMap.setMapType(map_type);
                return true;
            }
        });

Any ideia of what can be happening?

Either add ability to add a drawable animation programatically or make fab protected

what i want to accomplish is to have a custom fabDrawable with a custom animation programmatically so it supports v21 and below.

with current code I can only add an animation through xml.

have the ability to add a custom animation by code via hook method, or you can also make fab protected so we can access it and add it at runtime

let me know what you think

Error out of the box with ConstraintLayout

As stated in #32, im facing this same error ("Couldn't resolve @id/default_state") inmediately after adding to my layout -ConstraintLayout- the sample xml code :

    <io.github.yavski.fabspeeddial.FabSpeedDial
        android:id="@+id/pressed_state"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|start"
        app:fabGravity="bottom_start"
        app:fabMenu="@menu/menu_main"
        app:miniFabBackgroundTint="@android:color/white"
        app:miniFabDrawableTint="?attr/colorPrimaryDark"
        app:miniFabTitleTextColor="?attr/colorPrimaryDark" />

Obviusly I have no element with such id... I've seen when creating a new element and giving it the issued @id, it looks forward for @id/pressed_state, but not sure about how to fix this up.

Text Size

Hi, first all I would like to say thanks for this lib, it's really good.

But I am getting a problem here, I have a floating button with 4 options and one option has a big text, when depends the phone the text may break in two lines, and when this happen the icon has been hidden.

Is there any way to fix it? thanks

screen shot 2017-04-30 at 14 52 35

Error when trying to use FAB Speed Dial in a Coordinator Layout

I'm getting the following error when trying to use FAB Speed Dial in a Coordinator Layout

Default behavior class io.github.yavski.fabspeeddial.FabSpeedDialBehaviour could not be instantiated. Did you forget a default constructor?
java.lang.InstantiationException: class io.github.yavski.fabspeeddial.FabSpeedDialBehaviour has no zero argument constructor

Possibly related to #29 ?

I've added the following to FabSpeedDialBehaviour.javaand it seems to fix this.

public FabSpeedDialBehaviour() { }

Do you need a PR for this? Happy to provide one if so.

fab and menu item have background

screenshot_20161118-202659
Hello, I found fab and menu item shadow cover by rectangle background
I try 1.06 and 1.07 both.
android 6.0
can you help me
thanks

Hide FAB On Scroll in Coordinator Layout

This is a great library! If only it could behave like the FAB in the support library and hide on scroll.
Like this behavior demoed:
https://dab1nmslvvntp.cloudfront.net/wp-content/uploads/2016/01/1453282702Float-FAB.gif
I tried to make the library's FAB hide on scroll by following this tutorial (https://www.sitepoint.com/animating-android-floating-action-button/) but the library does not extend FAB so it did not work.
I am going to look into implementing this feature in the next few days. Most likely, it requires a bit of code in the library and then some code in the RecyclerView onScrollListener.

Event: onMenuCollapsed?

How to know if user didn't choose any menu item / clicked on the remaining visible activity after opening the fab menu?

RuntimeException when trying to use FabSpeedDialBehaviour

Great library btw thanks. However I'm seeing an issue using the FabSpeedDialBehaviour which I was hoping to use to hide the FAB when scrolling a recyclerview.

Using version fab-speed-dial:1.0.4

Min SDK 21,
Target 24,
buildToolsVersion "23.0.3"
Dependancies
compile 'com.android.support.constraint:constraint-layout:1.0.0-alpha4'
compile 'com.android.support:design:24.2.0'
compile 'com.android.support:multidex:1.0.1'
compile 'com.android.support:recyclerview-v7:24.2.0'

Caused by: java.lang.RuntimeException: Could not inflate Behavior subclass io.github.yavski.fabspeeddial.FabSpeedDialBehaviour
...
 Caused by: java.lang.NoSuchMethodException: <init> [class android.content.Context, interface android.util.AttributeSet]
                      at java.lang.Class.getConstructor(Class.java:531)
                      at java.lang.Class.getConstructor(Class.java:495)
                      at android.support.design.widget.CoordinatorLayout.parseBehavior(CoordinatorLayout.java:595)

This is my xml

  <io.github.yavski.fabspeeddial.FabSpeedDial
        android:id="@+id/addFab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="end|bottom"
        app:fabGravity="bottom_end"
        app:fabMenu="@menu/timeline_fab_menu"
        app:layout_behavior="io.github.yavski.fabspeeddial.FabSpeedDialBehaviour"
        app:miniFabBackgroundTint="@android:color/white"
        app:miniFabDrawableTint="?attr/colorPrimaryDark"
        app:miniFabTitleTextColor="?attr/colorPrimaryDark" />

How to change textSize in Title?

Hello! Thanks for this lib, it`s very pretty cool, but size of text seem very little. Can I somehow change textSize of title??

How to instanciate FabSpeedDial from fragment instead Activity

Hi Yavski, i want to know how can i do it, because this code doesn't work for me:
`FabSpeedDial fabSpeedDial = (FabSpeedDial) view.findViewById(R.id.fab_funciones);
fabSpeedDial.setMenuListener(new SimpleMenuListenerAdapter() {

        @Override
        public boolean onMenuItemSelected(MenuItem menuItem) {
            if (menuItem.getItemId() == R.id.addData){
                Toast.makeText(getActivity(),"Test Toast",Toast.LENGTH_SHORT).show();
            }
            return false;
        }
    });`

Thanks in advance.

Extra padding when used on KitKat

I made a new Android project to test your library out. So far it's wonderful, with one minor exception.

On API 19/KitKat, I see the following:

screenshot_1477345390

On the same device, using the standard FAB I see:

screenshot_1477345446

Why is there extra padding on the speed dial FAB?

For what it's worth, this is the layout code I am using:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:context="com.example.zolbrys.testproject.MainActivity">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:popupTheme="@style/AppTheme.PopupOverlay"/>

    </android.support.design.widget.AppBarLayout>

    <include layout="@layout/content_main"/>

    <!--<io.github.yavski.fabspeeddial.FabSpeedDial-->
        <!--android:layout_width="wrap_content"-->
        <!--android:layout_height="wrap_content"-->
        <!--android:layout_gravity="bottom|end"-->
        <!--app:fabGravity="bottom_end"-->
        <!--app:fabMenu="@menu/test_menu"-->
        <!--app:miniFabBackgroundTint="@android:color/white"-->
        <!--app:miniFabDrawableTint="?attr/colorPrimaryDark"-->
        <!--app:miniFabTitleTextColor="?attr/colorPrimaryDark"/>-->

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|end"
        android:layout_margin="@dimen/fab_margin"
        app:srcCompat="@android:drawable/ic_dialog_email"/>

</android.support.design.widget.CoordinatorLayout>

Where I am changing which FAB is commented obviously.

Any thoughts?

Zach

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.