web-dev-qa-db-ja.com

Androidクリック可能なレイアウト

線形レイアウトを設定して、クリック可能+フォーカスにするように設定しましたが、問題は、クリックしてもフォーカスが表示されないことです。フォーカスを表示するにはどうすればよいですか。

これが私のコードです

<LinearLayout
  Android:id="@+id/linear_tv_layout"
  Android:orientation="horizontal"
  Android:layout_width="fill_parent"
  Android:layout_height="fill_parent"
  Android:layout_weight="1"
  Android:clickable="true"
  Android:focusable="true"
  Android:paddingBottom="7px">
12
M2Gd

クリック可能なビュー(レイアウト)の背景として設定する必要があると思います 状態リストドローアブル 、これはドローアブルリソースであり、さまざまな状態または状態の組み合わせに対してさまざまなドローアブルを指定できます。選択、プレス用など。また、レイアウトの状態はそのすべての子に伝播します。


明確化-これは、以前にリンクされたドキュメントの例です。

res/drawable/button.xml :(描画可能な状態リストです)

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:state_pressed="true"
          Android:drawable="@drawable/button_pressed" /> <!-- pressed -->
    <item Android:state_focused="true"
          Android:drawable="@drawable/button_focused" /> <!-- focused -->
    <item Android:drawable="@drawable/button_normal" /> <!-- default -->
</selector>

button_pressedbutton_focused、およびbutton_normalは、これらの状態のボタンを表す通常のドローアブルであり、おそらくpngです(押すと挿入され、オレンジ色で強調表示されます)。

このリソースを「線形レイアウトボタン」の背景として設定した場合:

<LinearLayout
    Android:layout_height="wrap_content"
    Android:layout_width="wrap_content"
    Android:background="@drawable/button">
    ...
</LinearLayout>

これで、レイアウトの焦点を合わせると、背景画像が自動的に@drawable/button_focusedに設定されます。

もちろん、使用するすべてのドローアブルは、res/drawable/とともにbutton.xmlのリソースである必要があります。

16
bigstones

マテリアルデザインのボタンを押すアニメーション を任意の要素に適用するには、要素のAndroid background属性を次のように設定します。

Android:background="?android:attr/selectableItemBackground"

あなたの場合:

<LinearLayout
  Android:id="@+id/linear_tv_layout"
  Android:orientation="horizontal"
  Android:layout_width="fill_parent"
  Android:layout_height="fill_parent"
  Android:layout_weight="1"
  Android:clickable="true"
  Android:focusable="true"
  Android:paddingBottom="7px"
  Android:background="?android:attr/selectableItemBackground">
16
J Wang

@danLeon:Android:background = "@ Android:drawable/btn_default"の代わりに

あなたは使用する必要があります
Android:background = "@ Android:drawable/list_selector_background"

前者はUIも変更しますが、これは必須ではありません。

4
divdroid

ここにサンプルレイアウトがありますこれはあなたにいくつかのアイデアを与えることができます:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:orientation="vertical"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
>
<LinearLayout
  Android:background="@Android:drawable/btn_default"
  Android:clickable="true"
  Android:focusable="true"
  Android:layout_width="fill_parent"
  Android:layout_height="0dip"
  Android:layout_weight="1"
  >

  <ImageView
    Android:id="@+id/image"
    Android:src="@Android:drawable/star_big_on"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    />

</LinearLayout>

<LinearLayout
  Android:background="@Android:drawable/btn_default"
  Android:clickable="true"
  Android:focusable="true"
  Android:layout_width="fill_parent"
  Android:layout_height="0dip"
  Android:layout_weight="1"
  >

  <ImageView
    Android:id="@+id/image"
    Android:src="@Android:drawable/star_big_on"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    />

</LinearLayout>
</LinearLayout>
0
Shardul

簡単な方法は、次の属性を設定することです。Android:background="@Android:drawable/btn_default"

<LinearLayout
  Android:id="@+id/linear_tv_layout"
  Android:orientation="horizontal"
  Android:layout_width="fill_parent"
  Android:layout_height="fill_parent"
  Android:layout_weight="1"
  Android:clickable="true"
  Android:focusable="true"
  Android:paddingBottom="7px"
  Android:background="@Android:drawable/btn_default"
  >
0
Daniel De León

そのレイアウトをコードの前面に表示してみてください。

public void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);

    View mainView = this.findViewById(R.id.mainView);
    this.setContentView(mainView);

    LinearLayout linear_tv_layout = (LinearLayout)mainView.findViewById(R.id.linear_tv_layout);
    linear_tv_layout.bringToFront();
    // or: mainView.bringChildToFront(linear_tv_layout);
}

それが機能しない場合は、そのLinearLayoutにオーバーラップしているビューが1つ以上あるかどうかを確認してください。

0
user432219