我注意到我的主题自定义和inflater出现意外行为。
我在SearchView
<style name="GTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="searchViewStyle">@style/SearchView</item>
<!--...-->
</style>
<style name="SearchView" parent="Widget.AppCompat.Light.SearchView">
<item name="iconifiedByDefault">false</item>
<item name="queryBackground">@color/white</item>
</style>
对于搜索的配置
xml/searchable.xml
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
android:label="@string/app_name"
android:icon="@android:drawable/ic_menu_search"
android:hint="@string/search_hint"/>
menu/options_menu.xml
<menu
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/search"
android:title="@string/search_view_title"
android:icon="@drawable/ic_search_white_24dp"
android:orderInCategory="100"
app:showAsAction="collapseActionView|ifRoom"
app:actionViewClass="android.support.v7.widget.SearchView"/>
</menu>
当我从方法SearchView
创建onCreateOptionsMenu
时,未加载自定义
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
getMenuInflater().inflate(R.menu.options_menu, menu);
//Here I can already see that the costumization is missing with the debugger
//...
return true
}
但是,如果我使用SearchView
a为片段创建一个布局,例如:
layout/fragment_explorer.xml
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:context="com.geocodle.android.ui.explorer.ExplorerFragment">
<android.support.v7.widget.SearchView
android:layout_gravity="center"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:iconifiedByDefault="true">
</android.support.v7.widget.SearchView>
</FrameLayout>
在片段中
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_explorer, container, false);
}
然后我的SearchView
有自定义
在第一种情况下,布局由MenuInflater充气,在第二种情况下由LayoutInflater充气。 我读到,如果上下文不像ApplicationContext那样具有主题感知,则不会加载自定义。但在我的情况下,都使用Activity作为上下文。
您知道菜单Inflater是否有原因缺少定制?
更新
实际上,在我认为的两种情况下,上下文都不是来自同一个实例。即使使用MenuInflater
从活动中检索到this.getMenuInflater()
,SearchView
中的上下文(由MenuInflater提供)也是ContextThemeWrapper
的实例,其中LayoutInflater
上下文是我的活动GeoCodleActivity
。所以这似乎是行为不一样的原因。所以现在问题是如何在MenuInflater中将Activity作为上下文。我按照@pskink的建议尝试了新的MenuInflater (this)
(感谢您的建议)。这次我有正确的主题但是当我检索SearchView时它是null。我在SearchView构造函数中添加的断点甚至没有被触发
MenuInflater menuInflater = new MenuInflater(this);
menuInflater.inflate(R.menu.options_menu, menu);
//With this the SearchView is not null but Theme is not customized
//getMenuInflater().inflate(R.menu.options_menu, menu);
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
//SearchAction has not Searchview
MenuItem searchAction = menu.findItem(R.id.search);
//searchView is null
SearchView searchView = (SearchView) searchAction.getActionView();
答案 0 :(得分:0)
使用df['New']=df.b.drop_duplicates().map(df.b.value_counts())
df.New.fillna(-1,inplace=True)
df.New=df.New.astype(int)
df
Out[197]:
a b New
0 1 32 3
1 4 32 -1
2 5 32 -1
3 9 45 2
4 8 45 -1
5 3 76 4
6 5 76 -1
7 7 76 -1
8 9 76 -1
代替SupportMenuInflater
,它可以按预期工作。当然,我的活动性延长MenuInflater
所以在AppCompatActivity
onCreateOptionsMenu
答案 1 :(得分:0)
您可以创建自定义的 ThemedSearchView
class ThemedSearchView @JvmOverloads constructor(
context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
, defTheme: Int = R.style.CustomSearchView
) : SearchView(ContextThemeWrapper(context, defTheme), attrs, defStyleAttr)
您可以将自己的主题仅应用于 SearchView