无法将View.getContext强制转换为宿主Activity

时间:2016-09-05 15:36:26

标签: java android

<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是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>

这是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();

    }

}    

在我的MainActivity中

   setContentView(R.layout.activity_main);

java.lang.ClassCastException:android.view.ContextThemeWrapper无法强制转换为com.ujjwal.univhub.BaseActivity

我不能将上下文转换为托管视图的活动。

1 个答案:

答案 0 :(得分:0)

ClassCastException只是意味着对象不是type(或者不能像type那样安全地表现出来)。 This可能有帮助。

如果使用构造函数BaseActivity以编程方式创建显示上下文(您的new SearchView(yourBaseActivityContext)的视图,则不应抛出此异常。但是,从xml,我不确定LayoutInflater是否使用您的活动上下文或更通用的上下文来构建视图。

修改(响应操作评论)

  

我需要它通过baseActivity的处理程序在UI中发布数据。 KeyListener必须访问BaseActivity实例。如果我   必须使keylistener独立于活动,然后才需要   完全转变实施。

BaseActivity中,创建一个界面:

public interface KeyClickListener { void clicked(SomeUiData data) }

SearchView课程中添加一个方法,以注册可以通知的听众(例如您的BaseActivity

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

BaseActivity onCreate()中的

(以便在执行任何用户点击之前注册听众):

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
    }
});

所以,实际上,现在你有一个在你的BaseActivity中声明的监听器,它可以执行任何不需要KeyListener实例BaseActivity的UI更新操作。将mListener传递给您的KeyListener,并使用原始的KeyListener.onClicked()方法,您可以使用可以更新用户界面的点击/ ui数据调用您在KeyClickListener中声明的任何方法(因为它在活动中宣布。