Android自定义复合视图保存和恢复状态不起作用

 as16as1 发布于 2023-02-12 17:26

解决了...

我有一个包含一些其他控件的复合视图.我想重写保存onSaveInstanceStateonRestoreInstanceState,但我得到一个奇怪的结果.

Parcelable state给的说法onRestoreInstanceState是不是我的自定义子类的BaseSavedState,SavedState并且似乎总是BaseSavedState.EMPTY_STATE.(在下面查找"总是失败"的代码注释...

看起来这个问题很可能出现在保存部分,因为 几乎SavedState.writeToParcel没有被调用之后onSaveInstanceState enters.几乎就好像正在调用的人onSaveInstanceState在将结果持久化之前抛弃结果Parcel.

如果它有所不同,则此视图托管在片段中.

有任何想法吗?

这是我的班级定义:

public class AddressInput extends FrameLayout

这是我的onSaveInstanceStateonRestoreInstanceState一对:

@Override
protected Parcelable onSaveInstanceState()
{
    // Return saved state
    Parcelable superState = super.onSaveInstanceState();
    return new AddressInput.SavedState( superState, mCurrentLookUp );
}

@Override
protected void onRestoreInstanceState( Parcelable state )
{
    // **** (state == BaseSavedState.EMPTY_STATE) is also always true 

    // Cast state to saved state
    if ( state instance of AddressInput.SavedState )     // **** <---  always fails
    {
        AddressInput.SavedState restoreState = (AddressInput.SavedState)state;

        // Call super with its portion
        super.onRestoreInstanceState( restoreState.getSuperState() );

        // Get current lookup
        mCurrentLookUp = restoreState.getCurrentLookup();
    }
    else
        // Just send to super
        super.onRestoreInstanceState( state );
}

这是我的自定义BaseSavedState子类(内部类AddressInput):

public static class SavedState extends BaseSavedState
{
    private String mCurrentLookup;

    public SavedState(Parcelable superState, String currentLookup)
    {
        super(superState);
        mCurrentLookup = currentLookup;
    }

    private SavedState(Parcel in)
    {
        super(in);
        this.mCurrentLookup = in.readString();
    }

    public String getCurrentLookup()
    {
        return mCurrentLookup;
    }

    @Override
    public void writeToParcel(Parcel out, int flags)
    {
        super.writeToParcel(out, flags);
        out.writeString( this.mCurrentLookup );
    }

    public static final Parcelable.Creator CREATOR = new Parcelable.Creator()
    {
        public AddressInput.SavedState createFromParcel(Parcel in)
        {
            return new AddressInput.SavedState(in);
        }

        public AddressInput.SavedState[] newArray(int size) {
            return new AddressInput.SavedState[size];
        }
    };
}

DaveOddy.. 6

想出来......我的自定义视图与用于FrameLayout自定义视图的特定实例的ID具有相同的ID .实例正确保存了状态,然后由FrameLayout没有状态的状态覆盖(清除)状态.

我还将其基类更改为RelativeView更有意义的基类.

在自定义视图的XML中:


和实例用法:

    

更改为:(@ + id/addressInput - > @ + id/shippingAddress)

    

让你希望有一些范围确定ID来防止这种事情.为什么您必须了解自定义视图的内部结构以确保避免ID冲突?

1 个回答
  • 想出来......我的自定义视图与用于FrameLayout自定义视图的特定实例的ID具有相同的ID .实例正确保存了状态,然后由FrameLayout没有状态的状态覆盖(清除)状态.

    我还将其基类更改为RelativeView更有意义的基类.

    在自定义视图的XML中:

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_
                android:layout_
                android:padding="10dp"
                android:id="@+id/addressInput"
                android:background="@drawable/rounded_edit">
    

    和实例用法:

        <com.myStuff.AddressInput
                android:layout_
                android:layout_
                android:id="@+id/addressInput"
                android:layout_marginTop="10dp"
                app:addressMode="Domestic"
                app:showSelect="true"
                app:showClear="true" />
    

    更改为:(@ + id/addressInput - > @ + id/shippingAddress)

        <com.myStuff.AddressInput
                android:layout_
                android:layout_
                android:id="@+id/shippingAddress"
                android:layout_marginTop="10dp"
                app:addressMode="Domestic"
                app:showSelect="true"
                app:showClear="true" />
    

    让你希望有一些范围确定ID来防止这种事情.为什么您必须了解自定义视图的内部结构以确保避免ID冲突?

    2023-02-12 17:30 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有