Giter Site home page Giter Site logo

iielse / switchbutton Goto Github PK

View Code? Open in Web Editor NEW
674.0 674.0 192.0 3.86 MB

iOS风格SwitchButton。 只涉及到一个类文件,异常容易集成进入你的项目。支持开关的"延时和回滚"操作。only one class file, very easy to integrate into your program. support the delay operation and rolling back action of the switch

Java 100.00%
android switchbutton

switchbutton's People

Contributors

ielse avatar iielse 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

switchbutton's Issues

点击后通过网络请求更新状态异常

switcher.setOnStateChangedListener(object : SwitchView.OnStateChangedListener {
    override fun toggleToOn(view: SwitchView?) {
        viewModel.doSomethingAsync(1)
    }

    override fun toggleToOff(view: SwitchView?) {
        viewModel.doSomethingAsync(0)
    }
})

viewModel.state.observe(this) {
    switcher.setOpen(it)
}

如上场景,doSomethingAsync里会异步执行网络请求,如果请求成功会更新state (这是一个LiveData),更新成功后再通过observe 更新 open 状态。这是一个很正常的流程。

但是,如果网络请求失败,我希望什么都不做,即继续保持之前的状态。也即不会调用 switcher.setOpen 方法,但是我发现一个问题,再次点击无反应

查看源码,发现这里有问题:

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if ((state == STATE_SWITCH_ON || state == STATE_SWITCH_OFF) && (sAnim * bAnim == 0)) {
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    return true;
                case MotionEvent.ACTION_UP:
                    lastState = state;

                    bAnim = 1;
                    if (state == STATE_SWITCH_OFF) {
                        refreshState(STATE_SWITCH_OFF2);
                        listener.toggleToOn(this);
                    } else if (state == STATE_SWITCH_ON) {
                        refreshState(STATE_SWITCH_ON2);
                        listener.toggleToOff(this);
                    }

                    if (mOnClickListener != null) {
                        mOnClickListener.onClick(this);
                    }
                    break;
            }
        }
        return super.onTouchEvent(event);
    }

这个 if 进不去了,因为此时 state 状态为 STATE_SWITCH_OFF2STATE_SWITCH_ON2 ,那么这两个状态有什么用?

或者我的用法有什么问题吗?

Parcel android.os.Parcel@7c1d390: Unmarshalling unknown type code 2131296439 at offset 1204

大神啊,Parcel 写法不规范,我找了一个上午的问题...
在部分低内存的手机会出现这个情况,可以在开发者选项打开不保留活动模拟低内存
添加describeContents和CREATOR 可以解决问题
完整修改如下:

 static final class SavedState extends BaseSavedState {
        private boolean isOpened;

        SavedState(Parcelable superState) {
            super(superState);
        }

        private SavedState(Parcel in) {
            super(in);
            isOpened = 1 == in.readInt();
        }

        @Override
        public void writeToParcel(Parcel out, int flags) {
            super.writeToParcel(out, flags);
            out.writeInt(isOpened ? 1 : 0);
        }

        //必须
        @Override
        public int describeContents() {
            return 0;
        }
        //必须
        public static final Creator<SavedState> CREATOR = new Creator<SavedState>() {
            @Override
            public SavedState createFromParcel(Parcel in) {
                return new SavedState(in);
            }

            @Override
            public SavedState[] newArray(int size) {
                return new SavedState[size];
            }
        };
    }

setOnStateChangedListener()逻辑有问题

Readme我也看了,知道作者为什么要设置成这样。但是个人认为,从日常习惯上来说,这里不应该这么设计。通常来说,StateChangeListener肯定是用来监听状态变化的,而现在这里,如果单独设置这个Listener,控件就会变得无法使用,还需要单独实现内部逻辑。
如果想实现延时开关,控件只要提供一个状态检测函数,一个开关函数,APP内部逻辑可以很简单就实现延时开关操作了。而为了让控件自己支持延时开关操作而将普通意义上的StateChangeListener改成现在这样,感觉有点得不偿失啊。
还是建议修改一个这个函数的逻辑,让他仅仅能监听开关状态。

回调不方便

为什么回调之后要自己再设置开关的状态呢,应该是回调之前就自己在代码中设置好了,然后回调一个方法就行了,把设置好的状态返回回去,设计不是特别好

设置setOnStateChangedListener后无法打开开关

问题

当给Switch设置setOnStateChangedListener监听器后,点击Switch会一直卡在圆形柄略微变宽的状态,当注释掉监听器代码时就一切正常了,请问怎么回事呢?
注:使用纯Kotlin开发

环境

Android Stuido Version 3.0.1
compileSdkVersion 27
minSdkVersion 21
targetSdkVersion 27
gradle Build Version 3.0.1
gradle Version 4.1-all
kotlin Version 1.1.51

相关代码

xml

<ch.ielse.view.SwitchView
            android:id="@+id/mSecretSwitch"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="end"
            app:primaryColor="@color/colorAccent" />

Activity (使用Kotlin编写,Activity实现了监听器的两个接口)

mSecretSwitch.setOnStateChangedListener(this)

fragment中使用会有问题

明明切换了状态,但是没有反应,退出再进来重新获取状态就刷新了,证明触发了事件,但是界面没变化

没有支持Margin和paddding

直接用在项目中设置了margin和padding都不起作用,设置竖直剧中也并没有完全,好像有些偏上。希望作者可以检查一下。

这个使用起来方便很多,不想引入太多的文件可以用这个。非常感谢作者!

About component unavailability

@iielse

Hello,I added this dependency:

  • build.gradle(:app)
implementation 'com.github.iielse:switchbutton:1.0.4'

I added this component to the xml, and then reported an error:
ksnip_20210806-132547

The error message is as follows:

Class referenced in the layout file, com.github.iielse.switchbutton.SwitchView, was not found in the project or the libraries
Cannot resolve class com.github.iielse.switchbutton.SwitchView 

I don't know where is the problem? My JDK version is 11.0.11

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.