lib - how to use constraintlayout in android studio




requestFeature()는 내용을 추가하기 전에 호출되어야합니다. (5)

사용자 정의 제목 표시 줄을 구현하려고합니다.

여기 내 헬퍼 클래스입니다 :

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

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

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

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

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


글쎄, 오류 메시지가 알려주는대로하십시오.

requestFeature() 전에 setContentView() 를 호출하지 마십시오.

노트 :

댓글에서 언급했듯이, ActionBarSherlockAppCompat 라이브러리 모두에서 ActionBarSherlock requestFeature() 전에 requestFeature() 를 호출해야 requestFeature()


나는 그것이 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. 색상 속성이나 텍스트 크기로 내용보기의 스타일을 크게 지정하지 마십시오. 대화 상자가이를 처리하게하십시오. 다른 업체는 공급 업체가 색상을 뒤집었기 때문에 어두운 파란색 대화 상자에 검은 색 텍스트를 넣을 위험이 있습니다.

오류가 무엇이 잘못되었는지 정확하게 알려주지 않습니까? setContentView 호출 한 후 requestWindowFeaturesetFeatureInt 를 호출합니다.

그런데 setContentView 두 번 호출하는 이유는 무엇입니까?


필자의 경우에는 Activity 에서 DialogFragment 를 보여주었습니다. 이 대화 상자에서 나는 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
}

onCreate() 에서 setStyle(STYLE_NO_FRAME, 0) 을 제거하거나 onCreateDialog 제거합니다. 대화 상자가 생성 된 후에 대화 상자 설정이 변경 되었기 때문입니다.





android-activity