23

Xin chào bạn bè tôi đã triển khai Thư viện hỗ trợ ActionBar với v7 Appcompact. Tôi mở rộng lớp Activity của mình với ActionBarActivity. Dưới đây là tôi Lớp MainThư viện hỗ trợ Android ActionBar không hoạt động trong 2.3 Thiết bị

import android.os.Bundle; 
import android.support.v7.app.ActionBarActivity; 
import android.support.v7.widget.SearchView; 
import android.view.Menu; 
import android.view.MenuItem; 

public class MainActivity extends ActionBarActivity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.activity_main, menu); 
    MenuItem menuItem=menu.findItem(R.id.menu_settings); 
    SearchView mSearchView=(SearchView)menuItem.getActionView(); 
    return super.onCreateOptionsMenu(menu); 
     } 

    } 

Trong Manifest File I tuyên bố loại chủ đề như thế này

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.example.appcompactdemo" 
android:versionCode="1" 
android:versionName="1.0" > 

<uses-sdk 
    android:minSdkVersion="8" 
    android:targetSdkVersion="16" /> 

<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <activity 
     android:name="com.example.appcompactdemo.MainActivity" 
     android:label="@string/app_name" 
     android:theme="@style/Theme.AppCompat.Light.DarkActionBar"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
</application> 

trong style.xml như dưới đây:

<style name="ExampleTheme" parent="Theme.AppCompat.Light.DarkActionBar"> 
    <item name="homeAsUpIndicator">@drawable/new_indicator</item> 
    <item name="android:homeAsUpIndicator">@drawable/new_indicator</item> 
    </style> 

Trên Mã được làm việc Tốt với Android phiên bản 4.0 nhưng trong 2.3 thiết bị nó không hoạt động nó cho lỗi như:

java.lang.NoSuchMethodError: android.view.MenuItem.getActionView 
    07-26 04:11:40.900: E/AndroidRuntime(412): at com.example.appcompactdemo.MainActivity.onCreateOptionsMenu(MainActivity.java:24) 
07-26 04:11:40.900: E/AndroidRuntime(412): at android.app.Activity.onCreatePanelMenu(Activity.java:2158) 
07-26 04:11:40.900: E/AndroidRuntime(412): at android.support.v4.app.FragmentActivity.onCreatePanelMenu(FragmentActivity.java:224) 
07-26 04:11:40.900: E/AndroidRuntime(412): at android.support.v7.app.ActionBarActivity.superOnCreatePanelMenu(ActionBarActivity.java:224) 
07-26 04:11:40.900: E/AndroidRuntime(412): at android.support.v7.app.ActionBarActivityDelegateBase$1.run(ActionBarActivityDelegateBase.java:69) 
07-26 04:11:40.900: E/AndroidRuntime(412): at android.os.Handler.handleCallback(Handler.java:587) 
07-26 04:11:40.900: E/AndroidRuntime(412): at android.os.Handler.dispatchMessage(Handler.java:92) 
07-26 04:11:40.900: E/AndroidRuntime(412): at android.os.Looper.loop(Looper.java:130) 
07-26 04:11:40.900: E/AndroidRuntime(412): at android.app.ActivityThread.main(ActivityThread.java:3683) 
07-26 04:11:40.900: E/AndroidRuntime(412): at java.lang.reflect.Method.invokeNative(Native Method) 
07-26 04:11:40.900: E/AndroidRuntime(412): at java.lang.reflect.Method.invoke(Method.java:507) 
07-26 04:11:40.900: E/AndroidRuntime(412): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
07-26 04:11:40.900: E/AndroidRuntime(412): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
07-26 04:11:40.900: E/AndroidRuntime(412): at dalvik.system.NativeStart.main(Native Method) 

Vì vậy, bất kỳ ý tưởng nào tôi có thể giải quyết nó?

+0

Rõ ràng phương pháp này là không có sẵn trong phiên bản thấp hơn api.That tại sao điều này xảy ra. vì vậy hãy thử tăng phiên bản api. –

+0

Tôi nghĩ bạn nên nhìn vào ActionBarActivity.onCreatePanelMenu vì cái gì đó của nó mà ít nhất là ghi đè, trong khi onCreateOptionsMenu() không phải là – Antonio

+0

Bạn đã thêm Chế độ xem hành động như được mô tả trong [hướng dẫn dành cho nhà phát triển] (http://developer.android.com/guide) /topics/ui/actionbar.html#ActionView)? – Antonio

Trả lời

46

Tôi nghĩ rằng câu trả lời cho vấn đề của bạn là ở official developers guide:

Bạn nên khai báo phụ tùng tìm kiếm

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:yourapp="http://schemas.android.com/apk/res-auto" > 
    <item android:id="@+id/action_search" 
     android:title="@string/action_search" 
     android:icon="@drawable/ic_action_search" 
     yourapp:showAsAction="ifRoom|collapseActionView" 
     yourapp:actionViewClass="android.support.v7.widget.SearchView" /> 
</menu> 

Nếu bạn cần phải cấu hình quan điểm hành động (chẳng hạn như để thêm người nghe sự kiện), bạn có thể làm như vậy trong khi gọi lại onCreateOptionsMenu(). Bạn có thể có được đối tượng xem hành động bằng cách gọi phương thức tĩnh MenuItemCompat.getActionView() và truyền nó cho MenuItem tương ứng. Ví dụ, widget tìm kiếm từ ví dụ trên được mua lại như thế này:

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.main_activity_actions, menu); 
    MenuItem searchItem = menu.findItem(R.id.action_search); 
    SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem); // <-- change your code to this 
    // Configure the search info and add any event listeners 
    ... 
    return super.onCreateOptionsMenu(menu); 
} 
+0

Cảm ơn bạn đã đăng bài đang hoạt động –

+0

Nếu nó hoạt động, bạn có thể đánh dấu câu trả lời là được chấp nhận, vì vậy, những người dùng khác cũng biết điều đó;) – Antonio

+0

, nhóm phát triển Android đã xuất bản video giới thiệu thực sự hữu ích về [using ActionBarCompat] (http: // youtu .be/6TGgYqfJnyc) – Antonio

Các vấn đề liên quan