Vra

Ek gebruik 'n persoonlike titel siening in my aansoek vir elke aktiwiteit. In een van die aktiwiteite, gebaseer op die knoppie klik ek moet die persoonlike titel siening verander. Nou hierdie werk goed elke keer wanneer ek 'n oproep om setFeatureInt maak.

Maar as ek probeer om enige items in die persoonlike titel by te werk (byvoorbeeld verander die teks van 'n knoppie of 'n teks aansig op die titel), die update nie plaasvind nie.

Ontfouting deur die kode dui aan dat die teks aansig en knoppie gevalle is nie van nul en ek kan ook sien die persoonlike titel bar. Maar die teks op die teks oog of op die knoppie word nie meer bygehou. Het iemand anders die probleem in die gesig gestaar? Hoe kan ek los dit?

Dankie.

wysig

Hier is wat ek probeer. Nie eens raak by die dag roep 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();
Was dit nuttig?

Oplossing

Die probleem is dat die enigste Window implementering ( PhoneWindow ) gebruik 'n LayoutInflater in sy setFeatureInt metode en instantiates die nuwe uitleg met inflate en attachToRoot=true. Gevolglik wanneer jy setFeatureInt noem, die nuwe uitleg is nie van vervang , maar aangeheg om die interne titel houer en dus getrek op die top van mekaar.

Jy kan hierdie tydelike oplossing deur die gebruik van die volgende helper metode in plaas van setFeatureInt. Die helper net verwyder al uitsig vanaf die interne titel houer voor die nuwe persoonlike titel kenmerk is ingestel:


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..
    }
}

Ek is nie seker of die huidige setFeatureInt gedrag bedoel, maar dit is beslis nie gedokumenteer een of die ander en dit is waarom ek hierdie sal neem om die Android devs manier;)

wysig

As uitgewys in die kommentaar, die voorgenoemde tydelike oplossing is nie ideaal nie. In plaas van vertroue op die com.android.internal.R.id.title_container konstante jy kan eenvoudig verberg die ou gebruik titel wanneer jy 'n nuwe een te stel.

Kom ons veronderstel jy het twee persoonlike titel uitlegte:

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

en

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

en jy wil vervang custom_title_1 met custom_title_2, kan jy die voormalige wegsteek en gebruik setFeatureInt te voeg laasgenoemde:

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

Ander wenke

Die korrekte manier om dit te doen, is soos volg:

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

Let asseblief daarop dat die einde van hierdie stellings is baie belangrik.

As jy super.onCreate () roep voordat enige van die ander state sal jy 'n leë titel bar, kry wat die hack van die vind van die titelbalk id en die verwydering van al die Views daaruit sal regmaak, maar word nie aanbeveel.

Is jy 'n beroep ongeldig of postInvalidate om die oog na die teks opdatering teken? As dit is 'n persoonlike ondervinding, kan jy 'n breekpunt in die trekking kode om seker te maak dit is om genoem?

As jy op die UI draad, kan jy bel 'ongeldig' as jy nie is nie, moet jy bel 'postInvalidate' of die uitsig sal self nie teken.

Net my 2c werd:

By die werk in 'n MapActivity, versoek om 'n persoonlike titel tot gevolg gehad dat geen titel glad gewys.

Gelukkig, al wat ek wou doen, was om die titel teks anders gestel, en ek het gou besef dat net 'n beroep setTitle () binnekant van OnCreate () gewerk vir my (ek noem dit nadat ek setContentView () genoem)

Jammer, maar ek het nie tyd nie nou na hierdie meer ontfout en uit te vind waarom wat ek doen nie gewerk het nie, en hoekom verander dit maak dit werk. Soos ek gesê het, het net gedink dit kan iemand help op die pad.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top