0

私はすでに何時間もこれに苦労しており、解決策を見つけることができません。誰かが私を助けてくれることを願っています.
BaseAdapter を拡張するカスタム アダプターを備えた ListView があり、リストの各要素は TextView のみを含む LinearLayout を拡張します。私は基本的にカスタムボタンの状態を追加する方法から始めました。
これは、list 要素の list_item.xml レイアウト ファイルです。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res/com.example.mypackage"
    android:id="@+id/newItem"
    app:state_playing="true"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/item_selector"
    android:orientation="horizontal" >

    <TextView
        android:id="@+id/textview"
        style="@style/Text_View_Style_White"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:duplicateParentState="true"
        android:ellipsize="marquee"
        android:focusableInTouchMode="true"
        android:marqueeRepeatLimit="marquee_forever"
        android:padding="3dp"
        android:scrollHorizontally="true"
        android:singleLine="true"
        android:textColor="@drawable/item_text_selector" /> 
</LinearLayout>

BaseAdapter の関連コードは次のとおりです。

  class AlbumListAdapter extends BaseAdapter implements Checkable {

    private Context mContext;

    public AlbumListAdapter(Context context) {
        mContext = context;
    }

    @Override
    public int getCount() {

        return listSize; // is a variable
     }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        AlbumViewHolder albumHolder = null;
        if (convertView == null) {
            // Inflate the layout
            LayoutInflater li = getActivity().getLayoutInflater();
            convertView = li.inflate(R.layout.list_item, null);
            albumHolder = new AlbumViewHolder(mContext, null);
            albumHolder.albumTitle = (TextView) convertView
                    .findViewById(R.id.textview);

            convertView.setTag(albumHolder);
        } else {
            albumHolder = (AlbumViewHolder) convertView.getTag();
        }

        albumHolder.albumTitle.setText("Some text in the TextView");
        albumHolder.albumTitle.setSelected(true);

        if (myBooleanCondition) 
        {
            albumHolder.setPlaying(true);
            albumHolder.refreshDrawableState();

            for (int i = 0; i < albumHolder.getDrawableState().length; i++) {
                if (albumHolder.getDrawableState()[i] != 0)
                    System.out.println(TAG + " State i = "
                    + i + " -> " + getResources().getResourceEntryName(albumHolder.getDrawableState()[i]));
            }
        }

        return convertView;
    }
}

ここでは、LinearLayout を拡張するリスト要素クラス:

static class AlbumViewHolder extends LinearLayout {

        private static final int[] STATE_PLAYING_SET = { R.attr.state_playing };
        private boolean mIsPlaying = false;
        TextView albumTitle;

        public AlbumViewHolder(Context context, AttributeSet attrs) {
            super(context, attrs);
        }

        public void setPlaying(boolean isPlaying) {
            mIsPlaying = isPlaying;
        }

        @Override
        protected int[] onCreateDrawableState(int extraSpace) {
            final int[] drawableState = super
                    .onCreateDrawableState(extraSpace + 1);
            if (mIsPlaying) {
                System.out.println(TAG
                        + " - onCreateDrawableState() -> mIsPlaying = "
                        + mIsPlaying);
                mergeDrawableStates(drawableState, STATE_PLAYING_SET);
            }
            return drawableState;
        }
    }

ここに attrs.xml があります

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="music">
        <attr name="state_playing" format="boolean" />
        <attr name="playing" format="boolean" />
    </declare-styleable>
</resources>

ここでは、2 つのセレクターがセレクター状態を使用しようとしていますstate_playing。1 つは各要素の LinearLayout の背景用です (item_selector.xml):

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res/com.example.mypackage">

    <item android:drawable="@color/blue_fluo3" app:state_playing="true"/>
    <item android:drawable="@color/orange_fluo" android:state_pressed="true" app:state_playing="false"/>
    <item android:drawable="@color/orange_fluo" android:state_activated="true" app:state_playing="false"/>
    <item android:drawable="@android:color/transparent" app:state_playing="false"/>

</selector>

もう 1 つは TextView の textColor (item_text_selector.xml) 用です。

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res/com.example.mypackage">

    <item app:state_playing="true" android:color="@color/orange_fluo"/>
    <item android:state_pressed="true" app:state_playing="false" android:color="@color/black"/>
    <item android:state_activated="true" app:state_playing="false" android:color="@color/black"/>
    <item app:state_playing="false" android:color="@android:color/white"/>

</selector>

<item app:state_playing="false" android:color="@color/yellow"/>結果は両方で同じです。state_playing は機能しているように見えますが、状態が "false" でのみです。これは、テキスト セレクターとバックグラウンド セレクターのセレクター状態リストの先頭に行を追加すると、<item android:drawable="@color/red" app:state_playing="false"/>すべてが期待どおりに機能するためです。 、赤い背景の LinearLayout と黄色のテキストのテキストが表示されます!
もう何を試せばいいのか本当にわかりません... ( app:state_playing="true"xml レイアウトでデフォルトでプロパティをオブジェクト ( ) に設定しても機能しません!

ヘルプ、ヒント、経験の共有は大歓迎です!

4

1 に答える 1

0

私には問題ないように見えますが、以下のようにコンテナー レイアウトで duplicateParentState を設定することをお勧めします。私自身、それらの線に沿って問題を抱えていたという漠然とした記憶があります...

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res/com.example.mypackage"
android:id="@+id/newItem"
android:duplicateParentState="true"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/item_selector"
android:orientation="horizontal" >

<TextView
    android:id="@+id/textview"
    style="@style/Text_View_Style_White"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:duplicateParentState="true"
    android:ellipsize="marquee"
    android:focusableInTouchMode="true"
    android:marqueeRepeatLimit="marquee_forever"
    android:padding="3dp"
    android:scrollHorizontally="true"
    android:singleLine="true"
    android:textColor="@drawable/item_text_selector" /> 

于 2013-10-13T08:59:38.250 に答える