2012-06-22 4 views
12

मेरे पास एक बटन के अंदर एक सूची आइटम है।बटन के साथ सूची आइटम अब क्लिक करने योग्य नहीं है

जब बटन दिखाया जाता है, तो सूची आइटम अब क्लिक करने योग्य नहीं है। इसे फिर से क्लिक करने योग्य बनाने के लिए, मैंने बटन को एक दृश्य के साथ बदल दिया है। समस्या यह है कि, जब सूची आइटम क्लिक किया जाता है, तो बटन पृष्ठभूमि छवि को बदलता है (जैसे कि इसे क्लिक किया गया है)। इस बुरे व्यवहार से कैसे बच सकते हैं?

धन्यवाद

+0

स्पष्ट रूप से आपको बटन के लिए 'android: focusable =" false "की आवश्यकता है। यह सवाल – Raffaele

उत्तर

17

असल में मैं सिर्फ एक अद्भुत explaination पाया है: http://android.cyrilmottier.com/?p=525

समस्या और समाधान बहुत अच्छी तरह से वहाँ समझाया गया है।

+0

पर भी काफी आम है [रोमैन गाय से पोस्ट] [https://groups.google.com/forum/?fromgroups#!topic/android-developers/H94wJpuX-Zg) – Raffaele

-1

आप उस दृश्य की क्लिक किए गए व्यवहार वाली कोई xml फ़ाइल बना सकते हैं। एक xml फ़ाइल, custom_button.xml बनाएं (या जो भी आप इसे कॉल करना चाहते हैं) और इस कोड के साथ इसे भरने:

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

    <!-- Focused --> 
    <item android:state_focused="true" android:state_pressed="false" android:color="@color/black"/> 
    <!-- Pressed --> 
    <item android:state_focused="false" android:state_pressed="true" android:color="@color/black"/> 
    <!-- Focused+Pressed --> 
    <item android:state_focused="true" android:state_pressed="true" android:color="@color/black"/> 
    <!-- Disabled --> 
    <item android:state_enabled="false" android:color="@color/dark_grey_text"/> 
    <!-- Default --> 
    <item android:color="@color/white"/> 

</selector> 

फिर आप बदल सकते हैं

android:color="" 

करने के लिए

android:drawable="" 

और अपने ड्रॉइंग फ़ोल्डर में आपके पास किसी भी ड्रॉइंग संसाधनों को असाइन करें। तो देखने वाले अपने लेआउट के लिए xml फ़ाइल में, जोड़ें:

android:background="custom_button" 
2

आप इस कोशिश कर सकते हैं:

   yourButton.setFocusable(false); 
      yourButton.setFocusableInTouchMode(false); 
12

@Matroska द्वारा प्रदान की लिंक है कि सवाल का जवाब का हिस्सा:
आप माता-पिता ViewGroup कि लेआउट को परिभाषित करता है करने के लिए

android:descendantFocusability="blocksDescendants" 

जोड़ना होगा आपकी ListView की एक वस्तु का।

नोट: यह अब आपको हार्डवेयर बटन के साथ भीतरी बटन पर ध्यान केंद्रित करने की अनुमति नहीं देगा। (क्षमा करें, मैं अभी तक कोई टिप्पणी नहीं कर सकते हैं)

16

सेट आप बटन के लिए निम्नलिखित गुण

android:focusable="false" 
    android:focusableInTouchMode="false" 

ImageButton के लिए, यह भी जनक दृश्य

android:descendantFocusability="blocksDescendants" 
0

यहाँ के लिए निम्न जोड़ने का एक उदाहरण है ListView के अंदर एक क्लिक करने योग्य बटन। आप अपने वेब साइट से इंटेलीजे Gradle परियोजना डाउनलोड कर सकते हैं आप परियोजना डाउनलोड करना चाहते हैं: http://developersfound.com/ListButtonClickExample.zip

इस उदाहरण में कस्टम एडाप्टर क्लिक श्रोता के बजाय श्रोता टुकड़ा या गतिविधि के अंदर जा रहा है। ऐसा किया जाता है कि केवल श्रोता वस्तु पर ही होता है और सभी बटन दक्षता के लिए उनके लिए बाध्य होते हैं।यहाँ

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout 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" 
    tools:context="com.jc_systems.listbuttonclickexample.app.ItemFragment"> 

    <LinearLayout 
     android:id="@+id/test_container" 
     android:orientation="horizontal" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content"> 

     <ImageView 
      android:id="@+id/image_list_image" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:src="@drawable/exaple_icon" 
      android:layout_weight=".1" 
      android:layout_gravity="left|top"/> 

     <TextView 
      android:id="@+id/lbl_list_item" 
      android:layout_width="168dp" 
      android:layout_height="wrap_content" 
      android:text="I think this should take up two lines..." 
      android:layout_marginLeft="5dp" 
      android:layout_marginRight="5dp" 
      android:gravity="center_vertical|center_horizontal" 
      android:layout_gravity="center_vertical"/> 

     <Button 
      android:id="@+id/cmd_list_button" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="Hello" 
      android:layout_weight="0.2" 
      android:paddingLeft="0dp" 
      android:paddingRight="0dp" 
      android:paddingTop="0dp" 
      android:paddingBottom="0dp" 
      android:layout_gravity="right|top"/> 

    </LinearLayout> 

</FrameLayout> 

और CustomAdapter है:

यहाँ ListItem लेआउट है

import android.app.Activity; 
import android.app.AlertDialog; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.ImageView; 
import android.widget.TextView; 

import java.util.ArrayList; 

public class MyCustomAdapter extends ArrayAdapter { 

    private final ArrayList<FragmentItems> list; 
    private static Activity context; 
    private View.OnClickListener adaptrDynaListener = null; 

    public MyCustomAdapter(Activity context, ArrayList<FragmentItems> list) { 

     super(context, R.layout.fragment_items, list); 
     this.context = context; 
     this.list = list; 

     adaptrDynaListener = new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       String buttonText = ((Button) v).getText().toString(); 
       new AlertDialog.Builder(MyCustomAdapter.context).setTitle("Alert").setMessage(buttonText).setNeutralButton("OK", null).show(); 

      } 

     }; 

    } 

    static class ViewHolder { 

     protected ImageView image_list_image; 
     protected TextView lbl_list_item; 
     protected Button cmd_list_button; 

    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View view = null; 
     ViewHolder viewHolder = new ViewHolder(); 

     if (convertView == null) { 

      LayoutInflater inflator = context.getLayoutInflater(); 
      view = inflator.inflate(R.layout.fragment_items, null); 
      viewHolder.image_list_image = (ImageView) view.findViewById(R.id.image_list_image); 
      viewHolder.lbl_list_item = (TextView) view.findViewById(R.id.lbl_list_item); 
      viewHolder.cmd_list_button = (Button) view.findViewById(R.id.cmd_list_button); 
      viewHolder.cmd_list_button.setTag(viewHolder); 
      view.setTag(viewHolder); 

     } 
     else { 

      view = convertView; 
      viewHolder = (ViewHolder) view.getTag(); 

     } 

     ViewHolder holder = (ViewHolder) view.getTag(); 

     holder.lbl_list_item.setText(list.get(position).getMessage()); 
     holder.cmd_list_button.setText(list.get(position).getButtonText()); 
     holder.cmd_list_button.setOnClickListener(adaptrDynaListener); 

     return view; 

    }//public View getView(int position, View convertView, ViewGroup parent) 

    public int getCount() { 

     if(list.size() <= 0) { 

      return 1; 

     } 

     return list.size(); 

    } 

    public Object getItem(int position) { 

     return position; 

    } 

    public long getItemId(int position) { 

     return position; 

    } 

} 

मैं काफी बड़े पैमाने पर इस एडाप्टर पैटर्न परीक्षण किया है और यह ListView, ListActivities और ListFragments में बहुत ही स्थिर रहा है ।

संबंधित मुद्दे