web-dev-qa-db-ja.com

Android=

2つのフラグメントがあります。最初はボタンが内部にあり、もう1つは内部にListViewがあります(ListFragment)。

ユーザーが2番目のフラグメントにあるListViewを参照できるように、最初のフラグメント(ボタンのおかげ)が欲しいです。

そのため、ボタン付きの最初のフラグメントによってListViewを制御する必要があります。

フラグメント間の通信(1番目のフラグメントから2番目のフラグメントへの送信)に問題はありませんが、特定のリストアイテムを(プログラムで)選択するようにListViewに指示する方法がわかりません。

どの種類のListViewを使用する必要があり、ListViewにその項目の1つを選択/強調表示/フォーカスするように指示するにはどうすればよいですか?

ユーザーが最初のフラグメントのボタンを押すと、タッチモードになります。

setFocusableInTouchMode(true)またはsetChoiceMode(ListView.CHOICE_MODE_SINGLE)などを使用する必要がありますか?

50
Jecimi

これはしようとしている皆のためです:

-リストビューでプログラムでアイテムを選択

-このアイテムを強調表示のままにする

私はAndroid ICSに取り組んでいます、それがすべてのレベルのApiで動作するかどうかわかりません。

最初にリストビューを作成します(または既にlistActivity/listFragmentにいる場合は取得します)

次に、リストビューの選択モードをシングルに設定 with:Mylistview.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

次に、プログラムでアイテムを選択します with:Mylistview.setItemChecked(position, true);(位置は選択するアイテムのランクを示す整数です)

これでアイテムが実際に選択されましたが、選択の視覚的なフィードバックがないため、まったく何も表示されない場合があります。次の2つのオプションがあります。ビルド済みリストビューまたはカスタムリストビューを使用できます。

1)ビルド済みのリストビューが必要な場合は、_simple_list_item_activated_1_、_simple_list_item_checked_、_simple_list_item_single_choice_などを試してください...

リストビューは次のように設定できます。例:setListAdapter(new ArrayAdapter<String>(this, R.layout.simple_list_item_activated_1, data))

選択した事前構築リストビューに続いて、選択するとチェックボックスがオンになった、または背景色が変更されたなどが表示されます...

2)カスタムリストビューを使用する場合、各アイテムで使用されるカスタムレイアウトを定義します。このXMLレイアウトでは、選択時に変更する必要がある行の各パーツビューにセレクターを割り当てます。

選択したときに、行のテキストの色と背景の色を変更するとします。 XMLレイアウトは次のように記述できます。

_<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:background="@drawable/menu_item_background_selector"
    Android:orientation="horizontal" >

<TextView
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:gravity="center_vertical"
    Android:textColor="@drawable/menu_item_text_selector" />
_

次に、drawableフォルダーにmenu_item_background_selector.xmlとmenu_item_text_selector.xmlを作成します。

menu_item_text_selector.xml:

_ <?xml version="1.0" encoding="utf-8"?>
<selector
xmlns:Android="http://schemas.Android.com/apk/res/Android">

<item Android:state_activated="true"
     Android:color="#FFF">
</item>

<item Android:state_pressed="true"
     Android:color="#FFF">
</item>

<item Android:state_pressed="false"
     Android:color="#000">
</item>

</selector>
_

選択すると、テキストは白になります。

次に、背景に似たようなことをします:(色を使用するように強制されているわけではありませんが、ドロアブルを使用することもできます)

menu_item_background_selector.xml:

_<?xml version="1.0" encoding="utf-8"?>
<selector
xmlns:Android="http://schemas.Android.com/apk/res/Android">


        <item Android:state_activated="true"
        Android:color="#0094CE">
        </item>

        <item Android:state_pressed="true"
        Android:color="#0094CE">
        </item>

        <item Android:state_pressed="false"
        Android:color="#ACD52B">
        </item>


      </selector>
_

ここで、背景は選択されているときは青で、選択されていないときは緑です。

欠けていた主な要素は_Android:state_activated_でした。確かに(あまりにも)多くの状態があります:アクティブ化、押され、フォーカスされ、チェックされ、選択されています...

_Android:state_activated_と_Android:state_pressed_で指定したexempleが最適で最もクリーンなものかどうかはわかりませんが、うまくいくようです。

しかし、Custom CheckableRelativeLayout(これは汚くて怖い)を取得するために独自のクラスを作成する必要も、CheckableTextViewsを使用する必要もありませんでした。他の人がそのような方法を使用した理由はわかりませんが、Apiレベルに依存する可能性があります。

135
Jecimi

試す AbsListView.performItemClick(...)

performItemClickの使用方法については、 この投稿 を参照してください。

15

これは私のために働いたものです:

1)リストの選択動作を設定します。

 mListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

2)指定した位置のチェック状態を設定します。

mListView.setItemChecked(1,true); //Don't make the same mistake I did by calling this function before setting the listview adapter.

3)次のようなスタイルリソース(res/values)内に新しいスタイルを追加します。

<style name="activated" parent="Android:Theme.Holo">
<item name="Android:background">@Android:color/holo_green_light</item>
</style>

好きな色を自由に使用してください。

4)前に定義したstyleをListViewで使用します。

<ListView
        Android:id="@+id/listview"
        style="@style/activated"
        Android:layout_width="0dp"
        Android:layout_height="match_parent"
        Android:layout_weight="1"
        Android:divider="@Android:color/transparent"
        Android:dividerHeight="0dp"/>

または、行として使用するレイアウトで。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
  Android:layout_width="match_parent"
  Android:layout_height="wrap_content" 
  style="@style/activated"
>
  <!--widgets for your row here-->

</LinearLayout>

それが誰にも役立つことを願っています!

8
Axel

mListView.setSelection(position);を試してください

5
J_D

Jecimiの答えは、ごく一部を除いてはうまくいきました。他の人と共有したいと思います。 FragmentActivityのonCreate()でlist.setItemChecked( 0, true );を呼び出しても機能しませんでした。アダプタgetView()list.getCheckedItemPosition( )で-1が返されました。

このメソッドをprotected void onPostCreate( Bundle savedInstanceState )から呼び出さなければなりません。

4
package com.example.samsung;

import com.example.samsung.*;
import com.example.samsung.R;

import Android.os.Bundle;
import Android.app.Activity;
import Android.content.Intent;
import Android.view.Menu;
import Android.view.View;
import Android.widget.AdapterView;
import Android.widget.AdapterView.OnItemSelectedListener;
import Android.widget.ArrayAdapter;
import Android.widget.Button;
import Android.widget.ListView;
import Android.widget.Spinner;
import Android.widget.Toast;

public class Firstscreen extends Activity implements OnItemSelectedListener {
    Button btn;
     Spinner sp;
     public String[] product = { "ML-1676P/XIP","SLM2021W/XIP","SL-M2826ND/XIP","SL-M2826ND/XIP","SL-M2826ND/XIP","SL-M3320ND/XIP","SL-M3820ND/XIP","SL-M4020ND/XIP"};  


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_firstscreen);
        btn = (Button) findViewById(R.id.bn);
        sp= (Spinner) findViewById(R.id.sp);
    }
        public void button (View v){
            {

        Intent i = new Intent(Firstscreen.this,ML1676P.class);
        startActivity(i);
        }

        Spinner s1 = (Spinner) findViewById(R.id.sp);
        ArrayAdapter<String> adapter 
        = new ArrayAdapter<String>(this, 
                Android.R.layout.simple_spinner_item, product); // find other layout parameters
        s1.setAdapter(adapter);
        s1.setOnItemSelectedListener(new OnItemSelectedListener()
        {

            @Override
            public void onItemSelected(AdapterView<?> arg0, View arg1,
                    int arg2, long arg3) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onNothingSelected(AdapterView<?> arg0) {
                // TODO Auto-generated method stub

            }

    });
    }

    private Object product() {
            // TODO Auto-generated method stub
            return null;
        }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.firstscreen, menu);
        return true;
    }

    @Override
    public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,
            long arg3) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onNothingSelected(AdapterView<?> arg0) {
        // TODO Auto-generated method stub


    }



}
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:paddingBottom="@dimen/activity_vertical_margin"
    Android:paddingLeft="@dimen/activity_horizontal_margin"
    Android:paddingRight="@dimen/activity_horizontal_margin"
    Android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".Firstscreen"
    Android:orientation="vertical" >

    <TextView
        Android:id="@+id/tv1"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:textColor="#FF35B5E5"
        Android:layout_centerInParent="true"
        Android:text="CHOOSE THE PRODUCT FROM THE LIST" />

    <Spinner
        Android:id="@+id/sp"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_marginTop="10dp"
        Android:drawSelectorOnTop="true" />

    <Button
        Android:id="@+id/bn"
        Android:layout_width="285dp"
        Android:layout_height="wrap_content"
        Android:text="       GO             " 
        Android:onClick="button"/>


</LinearLayout>

リストビューでアイテムを選択すると、ボタンがクリックされると特定の選択されたアイテムのページに移動します。コードは上記のスニペットです

0
Hasid Mansoori

ListView#setSelection(int)を使用できます

0
asenovm

私はこれが好きです:

@Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if (isVisibleToUser) {
            try {
                int pos = 0;
                listview.performItemClick(null, pos, listview.getItemIdAtPosition(pos) );
            } catch (Exception e) {
                e.printStackTrace();
            }
        } 
    }
0
Faisal Shaikh