私は奇妙な問題を抱えています。私はtargetsdk 13でアプリを作っています。
メインアクティビティのonCreateメソッドで、getActionBar()
を呼び出してアクションバーをセットアップします。これはAndroid 3.2エミュレーターで実行する場合は正常に機能しますが、Android 3.0および3.1を使用する場合はgetActionBar()
メソッドはnullを返します。
私はこれが非常に奇妙だと思うし、そうする理由は見当たらない。これはエミュレーターのバグですか、アプリケーションにアクションバーがあることを確認するために何かする必要がありますか?
解決策:この問題の解決策を見つけたと思います。アクティビティのレイアウトを設定するためにsetContentViewを使用していませんでした。代わりに、アクティビティにフラグメントを追加するためにfragmentTransaction.add(Android.R.id.content, mFragment, mTag)
を使用していました。これは3.2では正常に機能しましたが、以前のハニカムバージョンでは、onCreate()
メソッドでsetContentViewを使用しない場合、アクションバーは明らかに設定されていません。そこで、setContentView()
メソッドでonCreate()
メソッドを使用し、空のFrameLayoutを含むレイアウトを指定するだけで修正しました。以前と同じ方法でfragmentTransaction.add(Android.R.id.content, mFragment, mTag)
メソッドを使用できます。
最もきれいな修正方法ではありませんが、機能します。
getSupportActionBar()
メソッドの代わりにgetActionBar()
を使用できます。
import Android.support.v7.app.ActionBarActivity;
public class MainActivity extends ActionBarActivity {
getSupportActionBar()
の代わりにgetActionBar()
を使用しますimport Android.support.v7.app.ActionBarActivity;
使用することをお勧めします:
import Android.support.v7.app.AppCompatActivity
アクティビティがビューをレンダリングする前に、ウィンドウタイプをアクションバーとして定義する必要があります。
つかいます
requestWindowFeature(Window.FEATURE_ACTION_BAR);
setContentView()メソッドを呼び出す前。
Android.support.v7.app.AppCompatActivityを使用している場合
パブリッククラスHomeActivityはAppCompatActivityを拡張します{
次に、使用する必要がありますAndroid.support.v7.app.ActionBar
ActionBar ab = getSupportActionBar();
Android.support.v4.app.FragmentActivityを使用している場合
パブリッククラスHomeActivityはFragmentActivityを拡張します{
次に、Android.app.ActionBarを使用する必要があります
ActionBar ab = getActionBar();
Android.support.v7.app.ActionBarActivityを使用している場合
パブリッククラスHomeActivityはActionBarActivityを拡張します{
Android.support.v7.app.ActionBarを使用する必要があります
ActionBar ab = getSupportActionBar();
getActionBar()
メソッドがnullを返す上記の問題に直面しました。 getActionBar()
を設定した後、null
を返した後、setContentView()
を呼び出していました。
最初に欠落していたAndroidマニフェストファイルにmin-sdkバージョンを設定することで問題を解決しました。 <uses-sdk Android:minSdkVersion="11" />
ActionBarには、アプリまたはアクティビティのテーマにアプリタイトルが必要です。アプリケーションまたはアクティビティのスタイルをTheme.NOTITLEにしていないことを確認してください。
<application
Android:name="com.xxx.yyy"
Android:debuggable="false"
Android:icon="@drawable/icon"
Android:label="@string/app_name"
Android:theme="@style/Theme.NoTitle"> // remove this line if you have this in your code
<activity
Android:name="com.xxx.yyy.Activity"
Android:configChanges="orientation|keyboardHidden|screenSize"
Android:theme="@style/Theme.NoTitle" // remove this line if you have in your code
Android:windowSoftInputMode="adjustResize|stateHidden" >
import Android.support.v7.app.AppCompatActivity;
それから
extends AppCompatActivity
次に使用する
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
この回答は遅れていますが、Googleから到着した人には役立つかもしれません:宣言する必要があるかもしれません
<item name="Android:windowActionBar">true</item>
styles.xml
で。 false
がデフォルトになる可能性があります。また、API 11以降を使用する必要があります。
詳細については、ドキュメントを参照してください here 。具体的には、引用:
ヒント:アクションバーを削除するカスタムアクティビティテーマがある場合は、Android:windowActionBarスタイルプロパティをfalseに設定します。ただし、テーマを使用してアクションバーを削除すると、ウィンドウはアクションバーをまったく許可しないため、後で追加することはできません。getActionBar()を呼び出すとnullが返されます。
その主な理由は、ActionBarをサポートしていないテーマを使用していることです。
マニフェストファイルで、ターゲットアクティビティまたはアプリケーション要素のいずれかに次を追加します(アプリケーション全体でテーマを統一する場合)
アクションバー"Theme.AppCompat.Light"
または"Theme.Holo.Light"
をサポートしているテーマの例...
Android:theme="@Android:style/Theme.Holo.Light"
すべてのスタイルをstyles.xml
に配置し、"@style/themName"
を使用してどこでも使用する方がよいので、前のスタイルは
Android:theme="@style/AppTheme"
また、styles.xmlには次のものが含まれます。
<style name="AppTheme" parent="Theme.AppCompat.Light">
ヒント:
"@Android:style/Theme.Holo.Light.DarkActionBar"
はSDKバージョン14より前ではサポートされないなど、古いSDKでは使用できないテーマがいくつかあります。アプリがSDKの最小特定バージョンをサポートできるようにするには、<app>
要素の下に次を追加できます。
<uses-sdk Android:minSdkVersion="14" />
AndroidStudioで最小SDKバージョンを指定するには、アプリのGradleファイルを使用します。
Android{
defaultConfig{
minSdkVersion 14
targetSdkVersion 21
}
}
私は同じ問題を抱えていましたが、解決策の1つはsetContentView()
を呼び出す前にgetActionBar()
を使用することでした。
しかし、問題を解決する別のことがありました。アプリケーションのテーマを@Android:style/Theme.Holo.Light
に指定しました。
<application
Android:allowBackup="true"
Android:icon="@drawable/ic_launcher"
Android:label="@string/app_name"
Android:theme="@Android:style/Theme.Holo.Light" >
...
</application>
<item name="Android:windowActionBar">true</item>
を含むすべてのテーマを使用できると思います。
私はこの問題に出くわしました。バージョン番号を確認し、Honeycomb以上の場合にのみアクションバーを有効にしましたが、nullを返していました。その理由と根本原因は、values-v11フォルダーの下のstyle.xmlでHolo Themeスタイルを無効にしたことでした。
androidManifest.xmlに移動して置き換えます
Android:theme = "@ style/AppTheme"
by
Android:theme = "@ Android:style/Theme.Holo.Light.DarkActionBar"
GetActionBar()の代わりにgetSupportActionBar()を使用します
私の場合、私のコードにはこれがあり、動作しませんでした:
@Override
protected void onCreate(Bundle savedInstanceState) {
context = getApplicationContext();
requestWindowFeature(Window.FEATURE_ACTION_BAR);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
次に、コードの順序で遊んでみました:
@Override
protected void onCreate(Bundle savedInstanceState) {
requestWindowFeature(Window.FEATURE_ACTION_BAR);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
context = getApplicationContext();
}
そしてうまくいきました!
結論:requestWindowFeatureは、onCreateメソッドで最初に呼び出す必要があります。
同じ問題がありました。 styles.xmlでAppテーマを変更することで解決しました
前
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
後
<!-- Base application theme. -->
<style name="AppTheme" parent="Android:Theme.Holo.Light.DarkActionBar">
私がこれに遭遇したので追加したかったのは、親を持つActivityでgetActionBar()を実行しようとすると、nullが返されることです。 ActivityがActivityGroup内に含まれるコードをリファクタリングしようとしていますが、ソースでActionBarが作成される方法のソースを確認した後、「ああ、ちょっと」と言うのに数分かかりました。
この変更により解決します。
Android:theme="@Android:style/Theme.Holo.Light" >
extends ActionBarActivity
import Android.support.v7.app.ActionBarActivity
にインポートを追加します私の場合、私は単にAppCompatActivity
の代わりにActivity
を拡張する必要がありました。
supportActionBar?.setDisplayHomeAsUpEnabled(true)
完全なアクティビティのサンプルクラス:
import Android.os.Bundle import androidx.appcompat.app.AppCompatActivity
//class LocationFound : Activity() { <-----Does not seem to work with ActionBar in recent versions
class LocationFound : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_location_found)
supportActionBar?.setDisplayHomeAsUpEnabled(true)
} }
バージョンについて
minSdkVersion 22
targetSdkVersion 29
これは一部の人々にも役立つかもしれません。
私の場合、menu.xmlでコンテキストを定義していなかったためです。
これを試して:
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
xmlns:tools="http://schemas.Android.com/tools"
tools:context="com.example.Android.ActionBarActivity">
これの代わりに:
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android">
ActionBarActivityからActivityクラスを拡張してみてください。これで解決しました。次のようなことをしてください:
public class MyActivity extends ActionBarActivity
{
. . .
私の場合、クラスはActivityからのみ拡張されていました。
他の回答に追加するには:
setActionBar()
を呼び出す前に、setSupportActionBar()
メソッドでonCreate()
またはgetActionBar()
を必ず呼び出してください。
Activity.xmlでツールバーを定義し、次にonCreate()で定義します。
Toolbar toolbar = (Toolbar) findViewById(R.id.my_toolbar);
setSupportActionBar(toolbar);
// Now you can use the get methods:
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
私はこの質問でパーティーに遅れていることを知っています(Androidには初めてです)が、ここで情報が非常に有用であり、私のような他の人が来た場合に必要なようにActionBarを動作させるために自分の努力の結果を追加する必要があると思いました助けを探しています。
ウィンドウタイトルのないフローティングウィンドウであるウィジェットがあります。スタイルテーマを使用して、Android:windowIsFloating
、Android:backgroundDimEnabled
、およびAndroid:windowNoTitle
を実装します。ウィジェットは、いくつかのリストフラグメントページを持つフラグメントページャーを呼び出し、ActionBarを使用するボタンを追加するまで、正常に機能しました。 nullポインタ例外でページャーアクティビティでクラッシュします。 ActionBarがnullになるように絞り込みました。このスレッドに貢献した以前の人々の発見に続いて、マニフェストファイルからテーマを削除し、ActionBarは正常に機能しましたが、今ではウィンドウがより長くフローティング(フルスクリーン)になり、ページタイトルが不要になりました。
さらなる研究により、私は Styles and Themes API Training Guide に導かれ、それが解決策につながりました。アプリケーションに適用する前に、カスタムテーマをマニフェストファイルの個々のアクティビティに追加できることを発見しました。これで、すべてのウィンドウが目的の外観になりました。
Android.support.v7.app.ActionBar actionBar = getSupportActionBar();
かなり速く動作します
コマンドクリックでソースコードの実装を確認するだけです。
private void initWindowDecorActionBar() {
Window window = getWindow();
// Initializing the window decor can change window feature flags.
// Make sure that we have the correct set before performing the test below.
window.getDecorView();
if (isChild() || !window.hasFeature(Window.FEATURE_ACTION_BAR) || mActionBar != null) {
return;
}
mActionBar = new WindowDecorActionBar(this);
mActionBar.setDefaultDisplayHomeAsUpEnabled(mEnableDefaultActionBarUp);
mWindow.setDefaultIcon(mActivityInfo.getIconResource());
mWindow.setDefaultLogo(mActivityInfo.getLogoResource());
}
requestWindowFeature(Window.FEATURE_ACTION_BAR); requestWindowFeature(Window.FEATURE_ACTION_BAR)が失敗するのを見たときの問題を修正しました。コードはオープンソースです!