Как использовать Пакет в Android?

Я только что нашел хороший способ решить эту проблему.

  1. Окружите кнопку, скажем, LinearLayout, который имеет отступ вокруг кнопки.
  2. Добавьте тот же клик к LinearLayout, что и для кнопки.
  3. В кнопке установите для duplicateParentState значение true, чтобы кнопка выделялась, когда вы нажимаете за пределами кнопки, но внутри LinearLayout.

    <LinearLayout
        android:layout_height="fill_parent"
        android:onClick="searchButtonClicked" 
        android:layout_centerVertical="true" 
        android:orientation="horizontal" 
        android:layout_width="wrap_content" 
        android:paddingRight="10dp" 
        android:paddingLeft="30dp">
        <Button 
            android:id="@+id/search_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@drawable/toggle_button_selector"
            android:textColor="#fff"
            android:text="Search"
            android:focusable="true"
            android:textStyle="bold"
            android:onClick="searchButtonClicked" 
            android:layout_gravity="center_vertical" 
            android:duplicateParentState="true"/>
    </LinearLayout>
    
55
задан emmby 4 November 2009 в 16:41
поделиться

2 ответа

Ах, наконец-то я нашел проблему. На самом деле их было два.

  1. СОЗДАТЕЛЬ должен быть публичным, а не защищенным. Но что еще более важно,
  2. вы должны вызвать setDataPosition (0) после демаршалинга ваших данных.

Вот исправленный рабочий код:

public void testFoo() {
    final Foo orig = new Foo("blah blah");
    final Parcel p1 = Parcel.obtain();
    final Parcel p2 = Parcel.obtain();
    final byte[] bytes;
    final Foo result;

    try {
        p1.writeValue(orig);
        bytes = p1.marshall();

        // Check to make sure that the byte stream seems to contain a Parcelable
        assertEquals(4, bytes[0]); // Parcel.VAL_PARCELABLE

        p2.unmarshall(bytes, 0, bytes.length);
        p2.setDataPosition(0);
        result = (Foo) p2.readValue(Foo.class.getClassLoader());

    } finally {
        p1.recycle();
        p2.recycle();
    }


    assertNotNull(result);
    assertEquals( orig.str, result.str );

}

protected static class Foo implements Parcelable {
    public static final Parcelable.Creator<Foo> CREATOR = new Parcelable.Creator<Foo>() {
        public Foo createFromParcel(Parcel source) {
            final Foo f = new Foo();
            f.str = (String) source.readValue(Foo.class.getClassLoader());
            return f;
        }

        public Foo[] newArray(int size) {
            throw new UnsupportedOperationException();
        }

    };


    public String str;

    public Foo() {
    }

    public Foo( String s ) {
        str = s;
    }

    public int describeContents() {
        return 0;
    }

    public void writeToParcel(Parcel dest, int ignored) {
        dest.writeValue(str);
    }


}
72
ответ дан 7 November 2019 в 07:15
поделиться

Осторожно! Не используйте Parcel для сериализации в файл

Parcel не является универсальным механизмом сериализации. Этот класс (и соответствующий Parcelable API для помещения произвольных объектов в Parcel) разработан как высокопроизводительный транспорт IPC. Таким образом, нецелесообразно помещать какие-либо данные Parcel в постоянное хранилище: изменения в базовой реализации любых данных в Parcel могут сделать старые данные нечитаемыми.

из http://developer.android.com/reference/android/os/Parcel.html

20
ответ дан 7 November 2019 в 07:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: