问题描述
我正在尝试实现动画搜索视图(使用简单的扩展/折叠动画),但此论坛中的所有答案都无效。
I'm trying to implement an animated searchview (with a simple extend/collapse animation) but all the answers in this forum are not working.
<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中的错误(所有图标都在项目中正确的名称):
errors in values.xml(all the icons are in the project with the correct name):
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。
Error:(1602, 21) No resource found that matches the given name: attr 'searchBackground'.Error:(1604, 21) No resource found that matches the given name: attr 'searchCloseIcon'.Error:(1606, 21) No resource found that matches the given name: attr 'searchSuggestionBackground'.Error:(1603, 21) No resource found that matches the given name: attr 'searchVoiceIcon'.Error:(1605, 21) No resource found that matches the given name: attr 'searchBackIcon'.Error:(1602, 21) No resource found that matches the given name: attr 'searchBackground'.Error:(1604, 21) No resource found that matches the given name: attr 'searchCloseIcon'.Error:(1606, 21) No resource found that matches the given name: attr 'searchSuggestionBackground'.Error:(1603, 21) No resource found that matches the given name: attr 'searchVoiceIcon'.Error:Execution failed for task ':app:processDebugResources'.com.android.ide.common.process.ProcessException: Failed to execute aapt.
推荐答案
有一个更容易方法(事实上,只有两行代码)并且它没有错误。您需要做的就是像以前一样在onCreateOptionsMenu()方法中填充SearchView,但是避免设置转换的代码行,因为它们不再需要了。
There is an easier approach (in fact, just two more lines of code) and it's bug-free. What you have to do is populating your SearchView in the onCreateOptionsMenu() method like you would have done before, but avoiding the lines of code where you set the transition, as they are not needed anymore.
接下来,覆盖onOptionsItemSelected(),如下所示:
Next, override onOptionsItemSelected() like this:
@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中:
This code prepares a transition and listens for changes in the toolbar layout. When the SearchView appears, the animation starts. It uses the same API as KitKat but it is available starting with ICS. In your build.gradle:
compile 'com.android.support:transition:24.2.1'
您还可以。
这篇关于Android:动画搜索视图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!