<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
我不能将上下文转换为托管视图的活动。
答案 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
中声明的任何方法(因为它在活动中宣布。