2013-10-04 89 views
0

Google如何在某些視圖上實施輔助操作。輔助操作的整個父視圖響應觸摸。這裏是什麼即時參照與輔助操作視圖輔助動作突出的例子:Android -secondary對listView項的操作

Secondary Action image example:

在這裏,我們可以通過點擊左側或點擊後打個電話作爲主要操作分隔者做了次要的動作。我想知道是否在API級別上有某些內容來實現此目的,如果不是,您可以推薦第三方。我想我也可以自己設計它。

回答

2

請參閱Android源代碼:

下面的代碼(ContactDetailFragment.java):

首先,他們定義一個名爲DetailViewCache一個自定義類,這是這樣的:

... 

/** 
* Cache of the children views of a contact detail entry represented by a 
* {@link DetailViewEntry} 
*/ 
private static class DetailViewCache { 
    public final TextView type; 
    public final TextView data; 
    public final ImageView presenceIcon; 
    public final ImageView secondaryActionButton; 
    public final View actionsViewContainer; 
    public final View primaryActionView; 
    public final View secondaryActionViewContainer; 
    public final View secondaryActionDivider; 
    public final View primaryIndicator; 

    public DetailViewCache(View view, 
      OnClickListener primaryActionClickListener, 
      OnClickListener secondaryActionClickListener) { 
     type = (TextView) view.findViewById(R.id.type); 
     data = (TextView) view.findViewById(R.id.data); 
     primaryIndicator = view.findViewById(R.id.primary_indicator); 
     presenceIcon = (ImageView) view.findViewById(R.id.presence_icon); 

     actionsViewContainer = view.findViewById(R.id.actions_view_container); 
     actionsViewContainer.setOnClickListener(primaryActionClickListener); 
     primaryActionView = view.findViewById(R.id.primary_action_view); 

     secondaryActionViewContainer = view.findViewById(
       R.id.secondary_action_view_container); 
     secondaryActionViewContainer.setOnClickListener(
       secondaryActionClickListener); 
     secondaryActionButton = (ImageView) view.findViewById(
       R.id.secondary_action_button); 

     secondaryActionDivider = view.findViewById(R.id.vertical_divider); 
    } 
} 

... 

然後,以擴充ListView的項目:

... 
private View getDetailEntryView(int position, View convertView, ViewGroup parent) { 
     final DetailViewEntry entry = (DetailViewEntry) getItem(position); 
     final View v; 
     final DetailViewCache viewCache; 

     // Check to see if we can reuse convertView 
     if (convertView != null) { 
      v = convertView; 
      viewCache = (DetailViewCache) v.getTag(); 
     } else { 
      // Create a new view if needed 
      v = mInflater.inflate(R.layout.contact_detail_list_item, parent, false); 

      // Cache the children 
      viewCache = new DetailViewCache(v, 
        mPrimaryActionClickListener, mSecondaryActionClickListener); 
      v.setTag(viewCache); 
     } 

     bindDetailView(position, v, entry); 
     return v; 
    } 
... 

然後你就可以找到他們所定義的onClickListener:

... 

     private final OnClickListener mSecondaryActionClickListener = new OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      if (mListener == null) return; 
      if (view == null) return; 
      final ViewEntry entry = (ViewEntry) view.getTag(); 
      if (entry == null || !(entry instanceof DetailViewEntry)) return; 
      final DetailViewEntry detailViewEntry = (DetailViewEntry) entry; 
      final Intent intent = detailViewEntry.secondaryIntent; 
      if (intent == null) return; 
      mListener.onItemClicked(intent); 
     } 
    }; 

... 

的XML佈局(contact_detail_list_item)的Android使用,如下圖所示(contact_detail_list_item.xml

<?xml version="1.0" encoding="utf-8"?> 
<!-- 
/* 
* Copyright 2009, The Android Open Source Project 
* 
* Licensed under the Apache License, Version 2.0 (the "License"); 
* you may not use this file except in compliance with the License. 
* You may obtain a copy of the License at 
* 
*  http://www.apache.org/licenses/LICENSE-2.0 
* 
* Unless required by applicable law or agreed to in writing, software 
* distributed under the License is distributed on an "AS IS" BASIS, 
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
* See the License for the specific language governing permissions and 
* limitations under the License. 
*/ 
--> 

<!-- Note: padding might be controlled programatically --> 
<FrameLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:paddingStart="16dip"> 

    <com.android.contacts.detail.ActionsViewContainer 
     android:id="@+id/actions_view_container" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal" 
     android:focusable="true" 
     android:background="?android:attr/selectableItemBackground" 
     android:nextFocusRight="@+id/secondary_action_view_container" 
     android:minHeight="@dimen/detail_min_line_item_height"> 

     <!-- Note: padding might be controlled programatically --> 
     <LinearLayout 
      android:id="@+id/primary_action_view" 
      android:layout_width="0dip" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" 
      android:orientation="vertical" 
      android:paddingStart="8dip" > 

      <TextView 
       android:id="@+id/data" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:textAppearance="?android:attr/textAppearanceMedium" /> 

      <LinearLayout 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:orientation="horizontal"> 

       <ImageView 
        android:id="@+id/presence_icon" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_marginTop="1dip" 
        android:layout_marginRight="4dip" 
        android:layout_marginEnd="4dip" 
        android:layout_gravity="center_vertical" 
        android:gravity="center" 
        android:scaleType="centerInside" /> 

       <TextView 
        android:id="@+id/type" 
        style="@style/ContactDetailItemType" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" /> 

       <View 
        android:id="@+id/primary_indicator" 
        android:layout_width="16dip" 
        android:layout_height="16dip" 
        android:visibility="gone" 
        android:layout_gravity="center_vertical" 
        android:background="@drawable/ic_list_default_mime_holo_dark" /> 

      </LinearLayout> 

     </LinearLayout> 

     <View 
      android:id="@+id/vertical_divider" 
      android:layout_width="1dip" 
      android:layout_height="match_parent" 
      android:layout_marginTop="@dimen/detail_vertical_divider_vertical_margin" 
      android:layout_marginBottom="@dimen/detail_vertical_divider_vertical_margin" 
      android:background="?android:attr/dividerVertical" /> 

     <!-- Note: padding might be controlled programatically --> 

從這個部分開始時你在做什麼尋找:

 <FrameLayout 
      android:id="@+id/secondary_action_view_container" 
      android:layout_width="wrap_content" 
      android:layout_height="match_parent" 
      android:paddingStart="@dimen/detail_item_icon_margin" 
      android:paddingEnd="@dimen/detail_item_icon_margin" 
      android:focusable="true" 
      android:background="?android:attr/selectableItemBackground" 
      android:nextFocusLeft="@id/actions_view_container"> 
      <ImageView 
       android:id="@+id/secondary_action_button" 
       android:layout_width="32dip" 
       android:layout_height="32dip" 
       android:layout_gravity="center_vertical" 
       android:duplicateParentState="false" /> 
     </FrameLayout> 
    </com.android.contacts.detail.ActionsViewContainer> 
</FrameLayout> 
1

沒有內置的API,視圖或其他自動生成此佈局的功能。

但是,自己創建它相對比較簡單,因爲這個佈局確實沒有什麼特別之處。

在您的例子,該行的佈局可能是這個樣子:

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="48dp" /> 

    <Button 
     android:id="@+id/callButton" 
     android:layout_width="500dp" 
     android:layout_height="match_parent" 
     style="@style/transparentButtonStyle" /> 

    <View 
     android:layout_width="1dp" 
     android:layout_height="match_parent" 
     android:background="@drawable/dotted_line" /> 

    <ImageButton 
     android:id="@+id/smsButton" 
     android:layout_width="48dp" 
     android:layout_height="match_parent" 
     android:src="@drawable/sms_button" 
     style="@style/transparentButtonStyle" /> 

</LinearLayout> 

你當然會需要提供transparentButtonStyle,dotted_line繪製,並smsButton繪製。你可能也想調整主鍵的寬度(也許一個RelativeLayout會更好)。