MenuInflater

时间:2018-06-16 09:50:00

标签: android android-theme

我注意到我的主题自定义和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();

2 个答案:

答案 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