2013-10-05 62 views
1

有没有人知道一种方式,我可以捕获一个长期点击以及在偏好片段中的偏好点击?长按偏好片段?

具体来说,我有一个扩展DialogPreference类,我希望它打开一个不同的对话框,基于它是单击还是长按。

我一直在试图实施这个一段时间了,似乎无法使它与偏好片段一起工作。 How to add a "long click listener" to a Preference?

谢谢!

回答

0

添加onCreateView()到您的PreferenceFragment类:

public class MyPreferenceFragment extends PreferenceFragment implements OnItemLongClickListener { 

... 

    @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

     Log.d("TAG", "onCreateView"); 

     View view = inflater.inflate(R.layout.settings, container, false); 
     ListView listView = (ListView) view.findViewById(android.R.id.list); 
     listView.setOnItemLongClickListener(this); 
     return view; 
    } 

    @Override 
    public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { 

     Log.d("TAG", "onItemLongClick"); 

     ListView listView = (ListView) parent; 
     ListAdapter listAdapter = listView.getAdapter(); 
     Object obj = listAdapter.getItem(position); 

     if (obj != null && obj instanceof View.OnLongClickListener) { 
      View.OnLongClickListener longListener = (View.OnLongClickListener) obj; 
      return longListener.onLongClick(view); 
     } else { 
      Preference pref = (Preference) obj; 
      ... 
     } 

     return true; 
    } 

... 

} 

的settings.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"> 

    <ListView 
     android:id="@android:id/list" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" > 
    </ListView> 

</LinearLayout> 
2

我有困难使得在嵌套优先选择屏幕的情况下,这项工作。由片段本身看到的ListView只是顶级列表。当你打开一个子屏幕时,你会弹出一个对话框。这是有问题的,因为(1)PreferenceScreen是最终的,并且(2)直到单击该项目时该对话框才存在,并且由于(1),从片段获得对话是困难的或不可能的。

我解决这个问题的方式有点破解,但我想,“如果我无法从层次结构中获取listView,我可以从下面获取它。”我的PreferenceScreen恰好充满了自定义首选项的实例。由于偏好显然不是最终的,因此我们可以利用这样的事实,即在创建偏好设置的视图时,偏好屏幕打开的确实存在。你可以很容易地访问它并应用Kostya的方法。

public class MyEditTextPreference extends EditTextPreference { 

    @Override 
    protected View onCreateView(ViewGroup parent) { 
     ListView listView = (ListView)parent; 
     listView.setOnItemLongClickListener(new ListView.OnItemLongClickListener() { 

      @Override 
      public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { 
       ListView listView = (ListView) parent; 
       ListAdapter listAdapter = listView.getAdapter(); 
       Object obj = listAdapter.getItem(position); 
       if (obj != null && obj instanceof View.OnLongClickListener) { 
        View.OnLongClickListener longListener = (View.OnLongClickListener) obj; 
        return longListener.onLongClick(view); 
       } 
       return false; 
      } 
     }); 
     return super.onCreateView(parent); 
    } 
} 

当然,如果你有多个喜好这样做,你会不断设置监听器一遍又一遍。如果需要,您可以添加一些检查来防止这种情况发生。