2

アプリケーションのアクティビティ イベントに割り当てることができるチェック ボックス (フォーカス エリア) のリストを表示するアクティビティがあります。ただし、ボタンをクリックしてフォームを編集モードにするまで、ユーザーフォームがこれらの値を編集できないようにしたいと考えています。

これをアプリケーションに実装する方法を説明したり、コードサンプルを提供したりできますか?

このリストは、アプリケーション用に作成したクラスであるタイプ FocusArea のカスタム ArrayAdapter を持つ ListView に保持されます。アクティビティの 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="match_parent" android:background="@drawable/horizontal_gradient_line_reverse">

    <TextView
        android:id="@+id/textViewCustomerNameNumber"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:text="Customer Name &amp; Number" android:layout_margin="5dp"/>

    <ListView
        android:id="@+id/listViewFocusAreas"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_above="@+id/relativeLayoutControls"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/textViewCustomerNameNumber"
        android:layout_margin="5dp"
        android:background="@drawable/myborder" >

    </ListView>

    <RelativeLayout
        android:id="@+id/relativeLayoutControls"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true" >


        <ImageView
            android:id="@+id/imageViewCancelFocusAreaChanges"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_alignParentTop="true"
            android:src="@drawable/ic_mini_undo" />

        <ImageView
            android:id="@+id/imageViewSaveFocusAreaChanges"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:layout_toLeftOf="@+id/imageViewCancelFocusAreaChanges"
            android:src="@drawable/ic_mini_save" />

        <ImageView
            android:id="@+id/imageViewEditFocusArea"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:layout_toLeftOf="@+id/imageViewSaveFocusAreaChanges"
            android:src="@drawable/ic_mini_edit" />

    </RelativeLayout>


    <ImageView
        android:id="@+id/imageViewEditMode"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/textViewCustomerNameNumber"
        android:layout_alignRight="@+id/listViewFocusAreas"
        android:src="@drawable/edit16x16"
        android:visibility="gone" />

</RelativeLayout>

以下は、フォーカス エリア行の xml です。

    <?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="match_parent"
    android:orientation="vertical" >

    <CheckBox
        android:id="@+id/checkBoxFocusArea"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Focus Area" />

</LinearLayout>

カスタム ArrayAdapter のコードは次のとおりです。

    public class FocusAreaAdapter extends ArrayAdapter<FocusArea> {

    private ArrayList<FocusArea> focusAreas;
    private Context context;

    public FocusAreaAdapter(Context context, int textViewResourceId, ArrayList<FocusArea> focusAreas) {
        super(context, textViewResourceId, focusAreas);
        this.context = context;
        this.focusAreas = focusAreas;
    }

    @Override
    public View getView(final int position, View convertView, final ViewGroup parent) {
        View v = convertView;
        if(v == null) {
            LayoutInflater vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = vi.inflate(R.layout.focus_area_menu_item, null);
        }
        FocusArea focusArea = focusAreas.get(position);

        if(focusArea != null) {
            CheckBox cbFocusArea = (CheckBox)v.findViewById(R.id.checkBoxFocusArea);
            cbFocusArea.setText(focusArea.getFocusAreaCodeDescription());
            if(focusArea.isFocusAreaCodeChecked() == 1) {
                cbFocusArea.setChecked(true);
            } else {
                cbFocusArea.setChecked(false);
            }

            cbFocusArea.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    FocusArea focusArea = focusAreas.get(position);
                    if(focusArea.isFocusAreaCodeChecked() == 1) {
                        focusArea.setFocusAreaCodeChecked(0);
                    } else {
                        focusArea.setFocusAreaCodeChecked(1);
                    }
                }
            });
        }       
        return v;
    }
}

最後に、次のコードを使用してカスタム配列アダプターをインスタンス化します。

    private void assignFocusAreasToAdapter() {
    // get reference to available responsibles list view control
    lvFocusAreas.clearChoices();

    // create an array adapter with the communications data array
    activityFocusAreaAdapter = new FocusAreaAdapter(this, R.layout.focus_area_menu_item, activityFocusAreas);

    // assign the my customers list control the array adapter
    lvFocusAreas.setAdapter(activityFocusAreaAdapter);
    activityFocusAreaAdapter.notifyDataSetChanged();
    Log.i(TAG, "Available Activity Focus Areas Loaded");
}
4

1 に答える 1

2

同じ問題を抱えている可能性のある人のために、この問題の解決策を見つけました。

フォーカス エリア アクティビティの XML は、上記と同じままです。

それに応じて、フォーカス エリアの行アイテムの XML が変更されます。

<?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="match_parent"
    android:orientation="vertical"
    android:descendantFocusability="blocksDescendants" >

    <CheckBox
        android:id="@+id/checkBoxFocusArea"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Focus Area" />

</LinearLayout>

これには次の行が追加されていることがわかりandroid:descendantFocusability="blocksDescendants"ます。これにより、通常は ListViews OnItemClickedListener の起動がブロックされるチェックボックス onClickListener の起動が防止されます。

カスタム アダプタ コードは、次のようにチェックボックス OnClickListener を削除するように変更されます。

public class FocusAreaAdapter extends ArrayAdapter<FocusArea> {

    private ArrayList<FocusArea> focusAreas;
    private Context context;

    public FocusAreaAdapter(Context context, int textViewResourceId, ArrayList<FocusArea> focusAreas) {
        super(context, textViewResourceId, focusAreas);
        this.context = context;
        this.focusAreas = focusAreas;
    }

    @Override
    public View getView(final int position, View convertView, final ViewGroup parent) {
        View v = convertView;
        if(v == null) {
            LayoutInflater vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = vi.inflate(R.layout.focus_area_menu_item, null);
        }
        FocusArea focusArea = focusAreas.get(position);

        if(focusArea != null) {
            CheckBox cbFocusArea = (CheckBox)v.findViewById(R.id.checkBoxFocusArea);
            cbFocusArea.setText(focusArea.getFocusAreaCodeDescription());
            if(focusArea.isFocusAreaCodeChecked() == 1) {
                cbFocusArea.setChecked(true);
            } else {
                cbFocusArea.setChecked(false);
            }

            cbFocusArea.setClickable(false);            
        }       
        return v;
    }
}

カスタム アダプターは、上記と同じコードを使用してインスタンス化されますが、OnItemClickListener を ListView に追加し、次のように OnItemClickListener クリック イベント内のチェックボックスのチェックを実行する必要があります。

    lvFocusAreas = (ListView)findViewById(R.id.listViewFocusAreas);
    lvFocusAreas.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        public void onItemClick(AdapterView<?> adapter, View view, int position, long id) {
            if(editMode){
                FocusArea focusArea = (FocusArea)lvFocusAreas.getItemAtPosition(position);
                if(focusArea.isFocusAreaCodeChecked() == 0) {
                    focusArea.setFocusAreaCodeChecked(1);
                } else {
                    focusArea.setFocusAreaCodeChecked(0);
                }
                activityFocusAreaAdapter.notifyDataSetChanged();
                setControlsEnabled();
            }               
        }
    });

これが同じ問題を抱えている人に役立つことを願っています。:D

于 2012-06-01T10:22:28.060 に答える