4 Stimmen

Ansicht über Canvas-Sichtbarkeitsproblem

Ich habe dieses Layout:

Es ist ein RelativeLayout über einer Leinwand. Am Anfang ist es unsichtbar, aber wenn ein Benutzer auf einen Button klickt, sollte das Layout sichtbar werden. Das Problem ist, dass es nicht sichtbar wird. Das Layout ist da, aber es wird einfach nicht gezeichnet. Wenn ich auf die Stelle drücke, an der das Layout erscheinen sollte, empfängt es das Ereignis und öffnet die Tastatur, aber es zeichnet nicht das gesamte Layout. Was ist das Problem?

Wenn ich das RelativeLayout zu Beginn auf sichtbar setze, funktioniert es einwandfrei. Es zeigt das Layout an und wenn ich zwischen unsichtbar und sichtbar wechsle, funktioniert es einwandfrei.

Ich habe einen Workaround gemacht, der fast immer funktioniert. Ich lasse das Layout zu Beginn sichtbar und mache dann folgendes im OnCreate:

chatLayout.postDelayed(new Runnable() {

        @Override
        public void run() {
            chatLayout.setVisibility(View.INVISIBLE);

        }
    }, 50);

Aber ich mag es nicht und möchte verstehen, was das Problem ist.

Der Code:

Es beginnt mit einem Canvas-Button, der eine Nachricht an einen Handler sendet:

public void showInputLayout() {
    Message.obtain(gameHandler, SHOW_INPUT_LAYOUT).sendToTarget();
}

Im Handler:

case SHOW_INPUT_LAYOUT:
                    gameActivity.setChatVisibility(true);
                    break;

setChatVisibility:

public void setChatVisibility(boolean isVisible) {
    int visible = isVisible ? View.VISIBLE : View.INVISIBLE;
    chatLayout.setVisibility(visible);
    if(isVisible){
        chatEditText.setFocusable(true);
        chatEditText.requestFocus();
    }
}

0voto

vicentazo Punkte 1589

Fügen Sie einen Klick-Listener zu RelativeLayout hinzu und wechseln Sie die Sichtbarkeit zwischen GONE und VISIBLE. Versuchen Sie so etwas wie:

int visibility = View.VISIBLE;
RelativeLayout layout = (RelativeLayout)findViewById(R.id.ChatLayout);
layout.setVisibility(visibility);
layout.setOnClickListener(new View.OnClickListener{
    public void onClick(View v)
    {
        if(visibility == View.VISIBLE)
            visibility = View.GONE;
        else
            visibility = View.VISIBLE;

        v.setVisibility(visibility);
    }
})

0voto

Joe Punkte 13960

Ich bin kürzlich auf ein ähnliches Problem gestoßen, und in meinem Fall lag das Problem tatsächlich in der onDraw() Methode der darunter liegenden Ansicht (sollte in Ihrem Fall com.components.game.GameView sein). Sehen Sie nach, ob Sie Aufrufe zu getSaveCount(), save() und restoreToCount() der Canvas in Ihrem Zeichnungscode hinzufügen können, ähnlich wie hier:

@Override 
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    int saveCount = canvas.getSaveCount();
    canvas.save();

    // benutzerdefinierter Zeichnungscode hier ...
    // verwenden Sie Region.Op.INTERSECT zum Hinzufügen von Ausschneidebereichen

    canvas.restoreToCount(saveCount);
}

Ich glaube, was passiert ist, dass manchmal das Framework die Ausschneidebereiche für die Elemente oben auf unserem Canvas-Zeichenwidget setzt, bevor unsere onDraw() Methode aufgerufen wird. Deshalb müssen wir sicherstellen, dass diese Bereiche erhalten bleiben.

I hope this helps.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X