컨텐츠를 추가하기 전에 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

여기에
karma

답변:


331

글쎄, 오류 메시지가 알려주는 것을 수행하십시오.

setContentView()전에 전화하지 마십시오 requestFeature().

노트 :

의견에서 말했듯이 ActionBarSherlock, AppCompat도서관 과 도서관 모두 requestFeature()전에 전화 해야합니다.super.onCreate()


60
젠장, 이것은 고급 답변입니다.
사람

60
ActionBarSherlock의 경우 requestFeature()before 호출 해야 super.onCreate()합니다. 참조 : github.com/JakeWharton/ActionBarSherlock/issues/…
Saran

1
제목 표시 줄없이 하나의 레이아웃을 표시 한 다음 제목 표시 줄로 하나의 레이아웃을 표시해야하는 경우 어떻게합니까? 당신은 사용해야합니다 requestWindowFeature(Window.FEATURE_NO_TITLE)다음, 그것을 숨길 setContentView()후, 첫 번째 레이아웃에 requestWindowFeature(Window.FEATURE_CUSTOM_TITLE)다시 제목 표시 줄을 표시합니다. 그것은 setContentView()두 번째 이후 입니다.
msbg

35
@Saran이 말한 것처럼 AppCompat에서도 마찬가지입니다. 당신은 당신을 호출해야합니다 requestFeature전에super.onCreate()
Jaison 브룩스

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. 머리글 바닥 글과 중간 뷰를 사용하여 자신 만의 View를 만들려고하지 마십시오. 위에서 언급 한 것처럼 FEATURE_NO_TITLE을 요청하더라도 헤더가 완전히 숨겨지지 않을 수 있습니다.
  3. 색상 속성이나 텍스트 크기로 콘텐츠보기의 스타일을 크게 지정하지 마십시오. 대화 상자에서 처리하도록하십시오. 그렇지 않으면 공급 업체가 색상을 반전시키기 때문에 검은 색 텍스트를 진한 파란색 대화 상자에 놓을 위험이 있습니다.

원래는 onCreate () 메소드에 setTitle () 및 setIcon ()을 게시했지만 편집을 통해 onPrepareDialog () 메소드 중에 호출되는 Preparing () 메소드로 이동했습니다.
Cookster 2016 년

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

2

오류가 정확히 무엇을 잘못 알려주지 않습니까? 당신은 전화를 requestWindowFeature하고 setFeatureInt있습니다 setContentView.

그건 그렇고, 왜 setContentView두 번 전화 합니까?


2

SDK 버전 23 이상의 경우 AppCompatActivity를 사용하여 활동을 확장하면 동일한 RuntimeException이 발생합니다. 활동이 활동에서 직접 파생되는 경우에는 발생하지 않습니다.

이것은 https://code.google.com/p/android/issues/detail?id=186440에 언급 된 Google의 알려진 문제입니다.

이에 대한 임시 해결책은 requestFeature ()를 사용하는 대신 supportRequestWindowFeature () 메소드를 사용하는 것입니다.

문제가 해결되면 공감하십시오.


1

변경 컴파일 SDK 버전 , 대상 SDK 버전 으로 빌드 도구 버전24.0.0build.gradle 유 요청 기능에 문제를 직면하는 경우


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()또는 chande / 삭제 onCreateDialog. 대화 상자가 작성된 후 대화 상자 설정이 변경 되었기 때문입니다.


0

API 26을 실행하는 장치에서는 제대로 작동했지만 API 23에서는 실패한 확장 된 DialogFragment 기반의 Dialogs에서이 문제가 발생했습니다. 위의 전략은 작동하지 않았지만 onCreateView 메소드를 제거하여 문제를 해결했습니다. DialogFragment에서 최신 Android Studio 템플릿을 찾고 onCreateDialog에서 대화 상자를 만듭니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.