2013-07-29 3 views
1

Я создаю очень простое приложение, в котором есть 1 панель действий. Я использую библиотеки AppCompat для поддержки с Android 2.1 или выше с неопределенным образом.Как добавить ActionBar из отдельного класса в Android с помощью AppCompat?

Я следую Google Guides и немного застрял. Я немного нуб, поэтому, пожалуйста, несите меня :)

Мой основной класс расширяет Activity, поэтому я создал новый класс, который расширяет ActionBarActivity.

package com.example.simpledice; 

import android.os.Bundle; 
import android.support.v7.app.ActionBar; 
import android.support.v7.app.ActionBarActivity; 
import android.view.Menu; 

public class DiceActionBar extends ActionBarActivity 
{ 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_dice_action_bar); 
     ActionBar actionBar = getSupportActionBar(); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) 
    { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.dice_action_bar, menu); 
     return true; 
    } 

} 

Затем я добавил так:

public class MainActivity extends Activity 
{ 

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

Это компилируется и развертывается, но нет панели действий. Я также пробовал что-то подобное с фрагментами, но без радости (даже не смог их собрать!). Я добавляю только один элемент в панель действий, чтобы он казался немного переполненным.

Может ли кто-нибудь сказать мне, где я ошибаюсь?

EDIT
Обновленный код согласно Tanis.7x ответ. К сожалению, ActionBar пока не отображается. Обновленный код:

public class MainActivity extends ActionBarActivity 
{ 
    private ActionBar actionBar; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     actionBar = getSupportActionBar(); 
     actionBar.show(); 
} 

@Override 
    public boolean onCreateOptionsMenu(Menu menu) 
    { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     // Inflate the menu items for use in the action bar 
     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.main, menu); 
     return super.onCreateOptionsMenu(menu); 
    } 

} 

Manifest:

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

    <uses-sdk 
     android:minSdkVersion="7" 
     android:targetSdkVersion="18" /> 

    <application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/Theme.AppCompat.Light.DarkActionBar" 
     android:uiOptions="splitActionBarWhenNarrow"> 
     <activity 
      android:name="com.example.simpledice.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> 

</manifest> 

Рез/меню/main.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android" > 
    <item android:id="@+id/action_search" 
      android:icon="@drawable/mute" 
      android:title="@string/muteOption" 
      android:showAsAction="ifRoom" 
      /> 

</menu> 

ответ

2

Спасибо за ответы Tanix. В конце вашего видео нашли решение. Проблема здесь:

<menu xmlns:android="http://schemas.android.com/apk/res/android" > 
    <item android:id="@+id/action_search" 
      android:icon="@drawable/mute" 
      android:title="@string/muteOption" 
      android:showAsAction="ifRoom" 
      /> 
</menu> 

При использовании каких-либо функций предварительного ячеистые, любые предметы, перечисленные в меню, которые после того, как соты должны быть в XML-имен «YourApp», как это:

<menu 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:SimpleDice="http://schemas.android.com/apk/res-auto" 
     > 
    <item android:id="@+id/action_search" 
      SimpleDice:icon="@drawable/mute" 
      android:title="@string/muteOption" 
      SimpleDice:showAsAction="ifRoom" 
      /> 
</menu> 

Действие Бар появляется теперь как сон.

Решено.

2

ActionBarActivity является деятельности, как вы можете видеть из ActionBarActivity documentation. Простое создание новой активности ничего не делает; вам нужно либо запустить новую операцию DiceActionBar, либо изменить способ использования ActionBarActivity.

В этом случае вам необходимо изменить MainActivity, чтобы расширить ActionBarActivity вместо Activity. Таким образом MainActivity должен выглядеть следующим образом:

public class MainActivity extends ActionBarActivity { 
    // The rest of your MainActivity code 
} 
+0

Это решение действительно делает код намного лучше, но все же нет панели действий. См. Отредактированный вопрос ... – BigTobster

+0

Я предлагаю посмотреть введение в [ActionBarCompat] (http://youtu.be/6TGgYqfJnyc). Вам также необходимо убедиться, что ваше приложение (или конкретные действия) использует тему AppCompat. Например, вы можете установить 'android: theme =" @ android: style/Theme.AppCompat "' для стиля Holo ActionBarCompat. Есть также стандартный свет и свет с темными вариантами ActionBar. –