문제

각 활동에 대한 응용 프로그램에서 사용자 정의 제목보기를 사용하고 있습니다. 활동 중 하나에서 버튼 클릭에 따라 사용자 정의 제목보기를 변경해야합니다. 이제 이것은 setfeatureint에 전화를 걸 때마다 잘 작동합니다.

그러나 사용자 정의 제목의 항목을 업데이트하려고하면 (버튼의 텍스트를 변경하거나 제목의 텍스트보기) 업데이트가 발생하지 않습니다.

코드를 통해 디버깅하면 텍스트보기 및 버튼 인스턴스가 Null이 아니며 사용자 정의 제목 표시 줄도 볼 수 있습니다. 그러나 텍스트보기 또는 버튼의 텍스트가 업데이트되지 않았습니다. 다른 사람 이이 문제에 직면 한 적이 있습니까? 어떻게 해결합니까?

감사.

편집하다

여기 내가 시도한 것이 있습니다. postinvalidate를 호출 할 때에도 업데이트되지 않습니다.

    getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.text_title);

    TextView databar = (TextView) findViewById(R.id.title_text);
    databar.setText("Some Text");
    databar.postInvalidate();

    Button leftButton = (Button) findViewById(R.id.left_btn);
    leftButton.setOnClickListener(mLeftListener);
    leftButton.setText("Left Btn");
    leftButton.postInvalidate();

    Button rightBtn = (Button) findViewById(R.id.right_btn);
    rightBtn.setOnClickListener(mRightListener);
    rightBtn.postInvalidate();
도움이 되었습니까?

해결책

문제는 유일한 것입니다 Window 구현 (PhoneWindow) a LayoutInflater 그것에 setFeatureInt 방법을 사용하고 새로운 레이아웃을 인스턴스화합니다 inflate 그리고 attachToRoot=true. 결과적으로 전화 할 때 setFeatureInt, 새로운 레이아웃은 아닙니다 교체 하지만 첨부된 내부 타이틀 컨테이너로, 따라서 서로 위에 그려집니다.

당신은 다음과 같은 헬퍼 메소드를 사용하여이를 해결할 수 있습니다. setFeatureInt. 도우미는 새로운 사용자 정의 제목 기능이 설정되기 전에 내부 타이틀 컨테이너에서 모든 뷰를 제거합니다.


private void setCustomTitleFeatureInt(int value) {
    try {
        // retrieve value for com.android.internal.R.id.title_container(=0x1020149)
        int titleContainerId = (Integer) Class.forName(
            "com.android.internal.R$id").getField("title_container").get(null);

        // remove all views from titleContainer
        ((ViewGroup) getWindow().findViewById(titleContainerId)).removeAllViews();

        // add new custom title view 
        getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, value);

    } catch(Exception ex) {
        // whatever you want to do here..
    }
}

전류가 확실하지 않습니다 setFeatureInt 행동은 의도 된 것이지만, 확실히 어떤 식 으로든 문서화되지 않았기 때문에 이것을 Android 개발자에게 가져갈 이유가 있습니다.)

편집하다

의견에서 지적한 바와 같이, 위에서 언급 한 해결 방법은 이상적이지 않습니다. 에 의존하는 대신 com.android.internal.R.id.title_container 당신은 단순히 할 수 있습니다 숨다 새로 설정할 때마다 기존 사용자 정의 제목입니다.

두 가지 사용자 정의 제목 레이아웃이 있다고 가정 해 봅시다.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout android:id="@+id/custom_title_1" ...

그리고

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout android:id="@+id/custom_title_2" ...

그리고 당신은 교체하고 싶습니다 custom_title_1 ~와 함께 custom_title_2, 당신은 이전을 숨기고 사용할 수 있습니다 setFeatureInt 후자를 추가하려면 :

findViewById(R.id.custom_title_1).setVisibility(View.GONE);
getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.custom_title_2);

다른 팁

이를 수행하는 올바른 방법은 다음과 같습니다.

requestWindowFeature( Window.FEATURE_CUSTOM_TITLE );
setContentView( R.layout.my_layout );
getWindow().setFeatureInt( Window.FEATURE_CUSTOM_TITLE, R.layout.my_custom_title );
super.onCreate( savedInstanceState );

이 진술의 순서는 매우 중요합니다.

다른 문장 중 하나 전에 super.oncreate ()를 호출하는 경우 빈 타이틀 바가 얻어지며,이 바에 해킹은 제목 막대 ID를 찾고 모든 뷰를 제거하는 해킹이 수정되지만 권장되지 않습니다.

텍스트를 업데이트 한 후 뷰를 다시 그리기 위해 무효 또는 Postinvalidate를 호출하고 있습니까? 사용자 정의보기라면 드로우 코드에 중단 점을 넣어 호출되는지 확인할 수 있습니까?

UI 스레드에있는 경우 '무효화'라고 부를 수 있습니다.

내 2C 가치 만 :

Mapactivity에서 작업 할 때 사용자 정의 제목을 요청하면 전혀 제목이 표시되지 않았습니다.

운 좋게도 제가하고 싶었던 것은 제목 텍스트를 다르게 설정하는 것 뿐이며, oncreate () 내부에서 settitle ()을 호출하는 것만으로 나를 위해 일했다는 것을 깨달았습니다 (setContentView ()에게 전화 한 후에 전화).

죄송하지만 지금 당장 더 이상 디버깅하고 내가하고있는 일이 작동하지 않는 이유와 변경으로 인해 작동하는 이유를 파악할 시간이 없습니다. 내가 말했듯이, 이것이 누군가가 길을 따라가는 데 도움이 될 것이라고 생각했습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top