2016-09-05 6 views
1
ここ

アクティビティ

<FrameLayout 
    android:id="@+id/content_frame" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:foreground="@drawable/window_foreground"> 

    <android.support.design.widget.AppBarLayout 
     android:id="@+id/appbar" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
     app:elevation="@dimen/appbar_resting" 
    android:theme="@style/AppTheme.NoActionBar"> 

     <com.ujjwal.univhub.components.SearchView 
      android:id="@+id/search_bar" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" /> 
    </android.support.design.widget.AppBarLayout> 

<include layout="@layout/fragment_university_lsit"></include> 

</FrameLayout> 

app_bar_main.xml searchViewをホストするView.getContextをキャストすることはできませんcustomFrameLayout.Iが私の主な活動のxmlファイルにこのXMLファイルを使用しています。

<FrameLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

<include 
    layout="@layout/app_bar_main" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 

    <include 
     layout="@layout/floating_action_group"/> 
</FrameLayout> 

これは私のMainActivityでactivity_main.xml

public class SearchView extends FrameLayout implements AdapterView.OnItemClickListener{ 


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


    SuggestionAdapter.ViewHolder viewHolder = (SuggestionAdapter.ViewHolder)view.getTag(); 
    University selectedUniversity = viewHolder.getUniversity(); 
    String sendData = FilterBuilder.createCodeFilter(selectedUniversity.getCode()).toJson(); 
    //may occure error here 
    Log.d("serach by name", "onItemClick: error"); 
    KeyListener listener = new KeyListener((BaseActivity)getContext());//error thrown here. 
    listener.onClicked(sendData, Properties.LOCALHOST + Properties.UNIVERSITY_CODE); 
    queryInput.setText(selectedUniversity.getName()); 
    suggestionAdapter.clear(); 
    suggestionAdapter.notifyDataSetChanged(); 

    } 

}  

setContentView(R.layout.activity_main); 

java.lang.ClassCastExceptionがある:android.view.ContextThemeWrapperは、COMにキャストすることはできません.ujjwal.univhub.BaseActivity

ビューをホストしているアクティビティにコンテキストをキャストできません。

答えて

0

ClassCastExceptionは、キャストしようとしているオブジェクトがtypeではない(または安全に動作しないことを意味する)ことを意味します。または、typeとして安全に動作できません。 Thisが役に立ちます。

あなたがプログラム的にコンストラクタnew SearchView(yourBaseActivityContext)を使用して明示的なコンテキスト(あなたBaseActivityを提供するビューを作成した場合、この例外がスローされるべきではありません。しかし、xmlからは、LayoutInflaterがアクティビティコンテキストを使用するのか、より一般的なコンテキストを使用してビューを構築するのかが分かりません。

編集:(OPさんのコメントに応答して)

私はそれがbaseActivityのハンドラを介してUIでデータをポストする必要があります。 KeyListenerはBaseActivityインスタンスにアクセスする必要があります。 i がアクティビティから独立したキーリストを作成する必要がある場合は、 の実装を完了する必要があります。あなたBaseActivity

、インターフェースを作る:

public interface KeyClickListener { void clicked(SomeUiData data) } 

は中

private BaseActivity.KeyClickListener mListener; 
public void setKeyClickListener(BaseActivity.KeyClickListener listener) { 
    mListener = listener; 
} 

を通知することができた(例えば、あなたのBaseActivity)リスナを登録するためにあなたのSearchViewクラスにメソッドを追加しますBaseActivityonCreate()(ユーザーがクリックする前にリスナーが登録されるように):

mSearchView = findViewById... ;// get your SearchView instance 
mSearchView.setKeyclickListener(new KeyClickListener() { 
    void clicked(SomeUiData newUiInfo) { 
     // update your UI using newUiInfo here 
     // use any handler accessible in your BaseActivity 
    } 
}); 

ので、効果的に、今、あなたはKeyListenerBaseActivityインスタンスを必要とせずに任意のUI更新アクションを実行することができ、あなたのBaseActivityで宣言されているリスナーを持っています。mListenerKeyListenerに渡し、元のKeyListener.onClicked()メソッドでは、KeyClickListenerで宣言したすべてのメソッドを、UIを更新できるclick/uiデータで呼び出すことができます(アクティビティで宣言されているため)。

+0

これは、基本操作のコールバックではなく、そのビュー上にあります。 BaseActivityでコールバックを実装していれば、BaseActivityを得るためにキャストする必要はありません。単に「this」キーワードで取得できます。 XMLファイルから作成したビューは、それをホストするアクティビティにキャストできます。ほとんどすべてのキャストは成功です。しかし、これで私はここに何があるのか​​分からない。 –

+0

はい、私はあなたのことを知っています。「BaseActivityを得るためには、まったくキャストする必要はありません。」_これは、私があなたのコードをどんな意味で作ることができるかに基づいて最初に提案した理由です。とにかく、ビューから取得した 'Context'を' Activity'にキャストすることは、あなたが見たように安全なコードではありません。私が話していたメソッドは 'KeyListener'オブジェクトの' onClicked() 'でした。なぜなら何らかの理由で' BaseActivity'インスタンス(あなたがコンストラクタで渡したように)が必要なので、私の推論です。 – bitbybit

+0

キャストに依存しないようにコードを変更する必要があるようです(どうして必要なのでしょうか?)、またはあなたの 'SearchView'コンストラクタにスタックトレースを記録し、' LayoutInflater'があなたのために使った 'context'ビュー。 – bitbybit

関連する問題