[英]Android: animate searchview
我正在嘗試實現動畫搜索視圖(帶有簡單的擴展/折疊動畫),但此論壇中的所有答案都無效。
<item
android:id="@+id/action_search"
android:orderInCategory="100"
android:title="@string/action_search"
app:actionViewClass="android.support.v7.widget.SearchView"
android:icon="@drawable/ic_search_white_48px"
app:showAsAction="always"/>
我做了什么
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
//Get the ID for the search bar LinearLayout
int searchBarId = searchView.getContext().getResources().getIdentifier("android:id/search_bar", null, null);
//Get the search bar Linearlayout
LinearLayout searchBar = (LinearLayout)
searchView.findViewById(searchBarId);
//Give the Linearlayout a transition animation.
searchBar.setLayoutTransition(new LayoutTransition());
return true;
}
所有的錯誤:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.daveslab.wideview, PID: 2459
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.LinearLayout.setLayoutTransition(android.animation.LayoutTransition)' on a null object reference
at com.daveslab.wideview.MainActivity.onCreateOptionsMenu(MainActivity.java:69)
at android.app.Activity.onCreatePanelMenu(Activity.java:2846)
at android.support.v4.app.FragmentActivity.onCreatePanelMenu(FragmentActivity.java:360)
at android.support.v7.view.WindowCallbackWrapper.onCreatePanelMenu(WindowCallbackWrapper.java:88)
at android.support.v7.app.AppCompatDelegateImplBase$AppCompatWindowCallbackBase.onCreatePanelMenu(AppCompatDelegateImplBase.java:331)
at android.support.v7.view.WindowCallbackWrapper.onCreatePanelMenu(WindowCallbackWrapper.java:88)
at android.support.v7.app.ToolbarActionBar.populateOptionsMenu(ToolbarActionBar.java:454)
at android.support.v7.app.ToolbarActionBar$1.run(ToolbarActionBar.java:61)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
values.xml中的錯誤(所有圖標都在項目中,名稱正確):
Error:(1605, 21) No resource found that matches the given name: attr 'searchBackIcon'.
錯誤:(1602,21)找不到與給定名稱匹配的資源:attr'searchBackground'。 錯誤:(1604,21)找不到與給定名稱匹配的資源:attr'searchCloseIcon'。 錯誤:(1606,21)找不到與給定名稱匹配的資源:attr'searchSuggestionBackground'。 錯誤:(1603,21)找不到與給定名稱匹配的資源:attr'searchVoiceIcon'。 錯誤:(1605,21)找不到與給定名稱匹配的資源:attr'searchBackIcon'。 錯誤:(1602,21)找不到與給定名稱匹配的資源:attr'searchBackground'。 錯誤:(1604,21)找不到與給定名稱匹配的資源:attr'searchCloseIcon'。 錯誤:(1606,21)找不到與給定名稱匹配的資源:attr'searchSuggestionBackground'。 錯誤:(1603,21)找不到與給定名稱匹配的資源:attr'searchVoiceIcon'。 錯誤:任務':app:processDebugResources'的執行失敗。 com.android.ide.common.process.ProcessException:無法執行aapt。
有一種更簡單的方法(事實上,只有兩行代碼)並且它沒有錯誤。 您需要做的就是像以前一樣在onCreateOptionsMenu()方法中填充SearchView,但是避免設置轉換的代碼行,因為它們不再需要了。
接下來,覆蓋onOptionsItemSelected(),如下所示:
@Override
public boolean onOptionsItemSelected(final MenuItem item) {
switch(item.getItemId()) {
case R.id.action_search:
TransitionManager.beginDelayedTransition((ViewGroup) getActivity().findViewById(R.id.toolbar));
MenuItemCompat.expandActionView(item);
return true;
}
return super.onOptionsItemSelected(item);
}
此代碼准備轉換並偵聽工具欄布局中的更改。 當SearchView出現時,動畫開始。 它使用與KitKat相同的API,但從ICS開始可用。 在build.gradle中:
compile 'com.android.support:transition:24.2.1'
這可能對你有所幫助。但如果能解決你的問題就接受答案。所以,它也會幫助別人。
SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
//Get the ID for the search bar LinearLayout
int searchBarId = searchView.getContext().getResources().getIdentifier("android:id/search_bar", null, null);
//Get the search bar Linearlayout
LinearLayout searchBar = (LinearLayout)
searchView.findViewById(searchBarId);
//Give the Linearlayout a transition animation.
searchBar.setLayoutTransition(new LayoutTransition());
Styles.xml
<style name="MaterialSearchViewStyle">
<item name="searchBackground">@color/white_ish</item>
<item name="searchVoiceIcon">@drawable/ic_action_voice_search</item>
<item name="searchCloseIcon">@drawable/ic_action_navigation_close</item>
<item name="searchBackIcon">@drawable/ic_action_navigation_arrow_back</item>
<item name="searchSuggestionBackground">@color/search_layover_bg</item>
<item name="android:textColor">@color/black</item>
<item name="android:textColorHint">@color/gray_50</item>
<item name="android:hint">@string/search_hint</item>
<item name="android:inputType">textCapWords</item>
</style>
在xml中使用該樣式
<item
android:id="@+id/action_search"
android:orderInCategory="100"
android:title="@string/action_search"
app:actionViewClass="android.support.v7.widget.SearchView"
android:icon="@drawable/ic_search_white_48px"
app:showAsAction="always"
style="@style/MaterialSearchViewStyle"/>
我回答有點遲,但上面的答案對我沒用。
SearchView searchView;
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.application_menu, menu);
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
searchView = (SearchView) menu.findItem(R.id.app_bar_search).getActionView();
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
LinearLayout searchBar = (LinearLayout) searchView.findViewById(R.id.search_bar);
searchBar.setLayoutTransition(new LayoutTransition());
return super.onCreateOptionsMenu(menu);
}
還有我的application_menu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/app_bar_search"
app:actionViewClass="android.support.v7.widget.SearchView"
android:icon="@drawable/ic_search_black_24dp"
android:title="Search"
app:showAsAction="ifRoom"
/>
</menu>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.