Estou tentando fazer um ArrayList
Parcelable
para passar para uma atividade uma lista de objetos personalizados. Começo a escrever uma myObjectList
classe que estende ArrayList<myObject>
e implementa Parcelable
.
Alguns atributos de MyObject
são boolean
mas Parcel
não têm nenhum método read/writeBoolean
.
Qual a melhor forma de lidar com isto?
android
parcelable
grunhido
fonte
fonte
Serializable
interface para comunicação entre atividades. Está lento.Respostas:
Aqui está como eu faria isso ...
writeToParcel:
readFromParcel:
fonte
/** * Write a byte value into the parcel at the current dataPosition(), * growing dataCapacity() if needed. */ public final void writeByte(byte val) { writeInt(val); }
writeByte
, mas na verdade escreve um int.Você também pode usar o método writeValue . Na minha opinião, essa é a solução mais direta.
Depois, você pode recuperá-lo facilmente com uma conversão simples para
Boolean
:Sob o capô, o Android Framework o tratará como um número inteiro:
fonte
você declara assim
Escreva
ler
O tipo booleano precisa ser convertido em algo que o Parcel suporta e, portanto, podemos convertê-lo em int.
fonte
AndroidStudio (usando 2.3 atm), após implementar o Parcelable na sua classe, você pode simplesmente segurar o ponteiro do mouse sobre o nome da sua classe e solicitar que você adicione a implementação parcelável:
Dos quatro campos, ele gera o seguinte:
fonte
Eu normalmente os tenho em uma matriz e chamo
writeBooleanArray
ereadBooleanArray
Se você precisar compactar um único booleano, faça o seguinte:
fonte
fonte
Basta ir em Arquivo-> Configurações-> Plug-ins-> Procurar Repositório e procurar por pacotes.
Ele criará automaticamente o Parcelable.
E há um webiste também para fazer isso. http://www.parcelabler.com/
fonte
Implementação curta e simples no Kotlin , com suporte anulável:
Adicionar métodos ao pacote
E use-o:
fonte
Você pode agrupar seus valores booleanos em um byte usando mascaramento e deslocamento. Essa seria a maneira mais eficiente de fazer isso e é provavelmente o que eles esperam que você faça.
fonte
writeByte()
método chama diretamentewriteInt()
É difícil identificar a verdadeira questão aqui. Eu acho que é como lidar com booleanos ao implementar a
Parcelable
interface.Você precisará armazenar o valor como uma sequência ou como um byte. Se você optar por uma string, precisará usar o método estático da
String
classe chamadavalueOf()
para analisar o valor booleano. Não é tão eficaz quanto salvá-lo em um byte resistente.Se você optar por um byte, precisará implementar uma lógica de conversão.
Ao desselecionar o
Parcel
objeto, você deve cuidar da conversão para o tipo original.fonte
writeByte()
método Parcel chama diretamentewriteInt()
. A lógica de conversão é muito detalhada. Apenas façawriteInt(boolean ? 1 : 0)
eboolean = readInt() != 0
Essa pergunta já foi respondida perfeitamente por outras pessoas, se você quiser fazer isso sozinha.
Se você preferir encapsular ou ocultar a maior parte do código de parcelamento de baixo nível, considere usar parte do código que escrevi há algum tempo para simplificar o manuseio de pacotes.
Escrever em um pacote é tão fácil quanto:
onde color é uma enum e isDriving é um booleano, por exemplo.
Ler de um pacote também não é muito mais difícil:
Basta dar uma olhada no "ParceldroidExample" que adicionei ao projeto.
Por fim, também mantém o inicializador CREATOR curto:
fonte
.class.getClassLoader()
.Existem muitos exemplos nas fontes do Android (AOSP). Por exemplo, a
PackageInfo
classe tem um membro booleanorequiredForAllUsers
e é serializado da seguinte maneira:fonte