コンテンツを追加する前にrequestFeature()を呼び出す必要があります


135

カスタムタイトルバーを実装しようとしています。

ここに私のヘルパークラスがあります:

import android.app.Activity;
import android.view.Window;

public class UIHelper {
    public static void setupTitleBar(Activity c) {
        final boolean customTitleSupported = c.requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);

        c.setContentView(R.layout.main);

        if (customTitleSupported) {
            c.getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.titlebar);
        }
    }
}

これがonCreate()で呼び出す場所です。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setupUI();
}

private void setupUI(){
     setContentView(R.layout.main);
     UIHelper.setupTitleBar(this);
}

しかし、私はエラーが出ます:

requestFeature() must be called before adding content

回答:


331

ええと、エラーメッセージが伝えていることを実行してください。

setContentView()前に電話しないでくださいrequestFeature()

注意:

コメントで述べたように、両方ActionBarSherlockAppCompatライブラリのために、requestFeature()前に呼び出す必要がありますsuper.onCreate()


60
いまいましい、これは上品な答えです。
Aパーソン

60
ActionBarSherlockの場合は、requestFeature()before も呼び出す必要がありますsuper.onCreate()。参考:github.com/JakeWharton/ActionBarSherlock/issues/...
サラン

1
タイトルバーなしで1つのレイアウトを表示し、次にタイトルバー付きでレイアウトを表示する必要がある場合はどうでしょうか。を使用requestWindowFeature(Window.FEATURE_NO_TITLE)して非表示にし、setContentView()最初のレイアウトで使用してrequestWindowFeature(Window.FEATURE_CUSTOM_TITLE)、タイトルバーを再度表示する必要があります。それはsetContentView()2回目以降になります。
msbg 2013

35
@Saranが言ったのと同じAppCompatのケース。requestFeature前に電話する必要がありますsuper.onCreate()
Jaison Brooks 2014

7
この答えはあまり役に立ちません...しかし、私が知っていること
Ojonugwa Jude Ochalifu

23

1年以上経過していることはわかっていますが、電話をかけてrequestFeature()も問題は解決しませんでした。実際、私はそれをまったく呼ばない。

それは私が推測するビューを膨らませることに関する問題でした。すべての検索にもかかわらず、ビューを拡大するさまざまな方法を試すまで、適切な解決策を見つけることはできませんでした。

AlertDialog.Builderは簡単なソリューションですが、を使用しonPrepareDialog()てビューを更新する場合、多くの作業が必要になります。

別の方法は、ダイアログにAsyncTaskを利用することです。

私が使用した最終的な解決策は以下の通りです:

public class CustomDialog extends AlertDialog {

   private View content;

   public CustomDialog(Context context) {
       super(context);

       LayoutInflater li = LayoutInflater.from(context);
       content = li.inflate(R.layout.custom_view, null);

       setUpAdditionalStuff(); // do more view cleanup
       setView(content);           
   }

   private void setUpAdditionalStuff() {
       // ...
   }

   // Call ((CustomDialog) dialog).prepare() in the onPrepareDialog() method  
   public void prepare() {
       setTitle(R.string.custom_title);
       setIcon( getIcon() );
       // ...
   }
}

*その他の注意事項:

  1. タイトルの非表示に依存しないでください。タイトルが設定されていないにもかかわらず、多くの場合、空のスペースがあります。
  2. ヘッダーフッターと中間ビューを使用して独自のビューを作成しないでください。上記のように、FEATURE_NO_TITLEをリクエストしても、ヘッダーが完全に非表示になるとは限りません。
  3. 色属性やテキストサイズを使用してコンテンツビューのスタイルを厳しく設定しないでください。ダイアログがそれを処理するようにします。そうしないと、ベンダーが色を反転させたために、濃い青色のダイアログに黒いテキストが表示されるリスクがあります。

最初はonCreate()メソッドでsetTitle()とsetIcon()をポストしましたが、編集により、onPrepareDialog()メソッドの間に呼び出されるprepare()メソッドに移動されました。
Cookster

2
共有いただきありがとうございます。次の行content = inflater.inflate(R.layout.custom_view, null);はおそらくそうなるはずcontent = li.inflate(R.layout.custom_view, null);です。したがって、inflaterに置き換える必要がありliます。
aLearner

14

私はDialogFragmentを拡張していましたが、上記の答えは機能しませんでした。タイトルを削除するには、getDialog()を使用する必要がありました。

getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);

@ojonugwaochalifuしばらく前だったので、正確には覚えていませんが、setcontentView()メソッドの前に実行する必要があると確信しています
不正な引数

1
同じ問題に直面している人:このコードをonViewCreated()に追加しました。
7geeky 2016

2

エラーは正確に何が問題なのかを教えてくれませんか?あなたが呼び出しているrequestWindowFeatureとあなたが呼び出しているsetFeatureIntsetContentView

ところで、なぜsetContentView二度電話するの?


2

SDKバージョン23以降の場合、AppCompatActivityを使用してアクティビティを拡張すると、同じRuntimeExceptionがスローされます。アクティビティがアクティビティから直接派生する場合は発生しません。

これは、https://code.google.com/p/android/issues/detail?id = 186440に記載されているGoogleの既知の問題です

このための回避策は、requestFeature()を使用する代わりにsupportRequestWindowFeature()メソッドを使用することです。

問題が解決した場合は、賛成投票してください。


1

リクエスト機能で問題が発生した場合は、ビルドSDKのバージョンターゲットSDKのバージョンビルドツールのバージョンbuild.gradleのバージョン24.0.0に変更します。


0

私の場合、で示しDialogFragmentましたActivity。このダイアログフラグメントで、DialogFragmentのように記述して、黒い境界線を削除します

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setStyle(STYLE_NO_FRAME, 0)
}

override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
    super.onCreateDialog(savedInstanceState)

    val dialog = Dialog(context!!, R.style.ErrorDialogTheme)
    val inflater = LayoutInflater.from(context)
    val view = inflater.inflate(R.layout.fragment_error_dialog, null, false)
    dialog.setTitle(null)
    dialog.setCancelable(true)
    dialog.setContentView(view)
    return dialog
}

削除setStyle(STYLE_NO_FRAME, 0)するonCreate()か、シャンデ/削除しonCreateDialogます。ダイアログの作成後にダイアログの設定が変更されたためです。


0

APIを実行しているデバイスでは正常に機能しましたが、API 23では失敗しました。最近のAndroid Studioテンプレート)DialogFragmentから、onCreateDialogでダイアログを作成します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.