2013-12-17 3 views
0

SearchView 클래스를 확장하여 onKeyDown() 메서드를 재정의하려고합니다. 그래서 나는 아래와 같이 조각 클래스 내에서 그것을 수행합니다 :조각 내에서 SearchView를 확장하는 방법

public class myfragment extends ListFragment{ 
... 
class CustomSearchView extends SearchView{ 
    public CustomSearchView(Context context) { 
     super(context); 
    }  

    public CustomSearchView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    @Override 
    public boolean onKeyDown(int keyCode, KeyEvent event){ 
     Toast.makeText(getActivity(), "onkeydown", Toast.LENGTH_SHORT).show(); 
     return super.onKeyDown(keyCode, event); 
    } 
} 
... 
} 

이제 조각에서이 확장 된 SearchView를 사용하고자합니다. 그러나 나는 그것을하는 방법을 모르겠다. searchItem.getActionView()를 사용하여 SearchView 객체를 작성 했으므로 오버라이드 된 onKeyDown 메소드가 내 조각에서 트리거되도록 CustomSearchView 객체로 캐스팅 할 수있는 방법이 있습니까?

@Override 
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
    ... 

      // Retrieves the system search manager service 
      final SearchManager searchManager = 
        (SearchManager) getActivity().getSystemService(Context.SEARCH_SERVICE); 

      // Retrieves the SearchView from the search menu item 
      final SearchView searchView = (SearchView) searchItem.getActionView(); 

      // Assign searchable info to SearchView 
      searchView.setSearchableInfo(
        searchManager.getSearchableInfo(getActivity().getComponentName())); 

      searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 
       @Override 
       public boolean onQueryTextSubmit(String queryText) { 
        // Nothing needs to happen when the user submits the search string 
        return true; 
       } 

       @Override 
       public boolean onQueryTextChange(String newText) { 
        ... 
       } 
      }); 

이 질문 때문에 당신은 사용자 정의 SearchView으로 캐스팅 할 수 How can I get onBackPressed() while SearchView is activated?

답변

0

에서 언급 한 솔루션의 팝업 :

final CustomSearchView searchView = (CustomSearchView) searchItem.getActionView(); 

당신은 SearchView 사용 자신의 SearchView를 선언해야 선언 할 때 meny xml 파일의 전체 클래스 이름.

없음 지원 라이브러리 :

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

<item android:id="@+id/action_search" 
     android:title="@string/action_search" 
     android:icon="@drawable/action_search" 
     android:showAsAction="always|collapseActionView" 
     android:actionViewClass="com.xxx.ListFragment.CustomSearchView" /> 

지원 라이브러리 :

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:yourapp="http://schemas.android.com/apk/res-auto" > 

<item android:id="@+id/action_search" 
     android:title="@string/action_search" 
     android:icon="@drawable/action_search" 
     yourapp:showAsAction="always|collapseActionView" 
     yourapp:actionViewClass="com.xxx.ListFragment.CustomSearchView" /> 
+0

메뉴 인플레이터가 클래스를 찾을 수 없습니다 예외가 발생하면 지원 라이브러리를 사용하는 경우 또한, 당신은 http://schemas.android.com/apk/res-auto 네임 스페이스를 선언해야 클래스 "com.example.xxx.PhoneContactListFragment.CustomSearchView"에 대한 런타임에. 나는 여기서 내가 무엇을 잘못하고 있는지 확신하지 못한다. "yourapp : showAsAction"이 아니라 "android : showAsAction"을 사용합니다. "android : actionViewClass"와 동일합니다. 왜냐하면 내가 "yourapp : .."를 사용하면 편집기에 "com.example.xxx '패키지의'showAsAction '속성에 대한 리소스 식별자가 없습니다"라는 메시지가 나타납니다. – faizal

+0

지원 라이브러리를 사용하는 중일 수도 있습니다. 하지마. 'android' 네임 스페이스를 사용하십시오. 오류에 관해서는, 당신의 클래스 공개입니다. 프래그먼트 클래스 밖에 놓을 수 있을까요? – Szymon

+0

맞습니다! 지원 라이브러리를 사용하지 않기 때문에'android' 네임 스페이스를 사용합니다. 'CustomSearchView' 클래스를 자신의 java 파일에두면 오류가 해결되었습니다. 그러나'onKeyDown'은'SearchView' 나 소프트 키보드의 어떤 문자를 만질 때 전혀 트리거되지 않습니다. 조각 클래스의 검색보기에서 정의 된'onQueryTextLListener'는 예상대로 트리거됩니다. 그러나 onKeyDown이 전혀 호출되지 않는 이유를 이해할 수 없습니다. – faizal

관련 문제