13 Stimmen

PopupWindow außerhalb des Bildschirms, wenn die Größe nicht angegeben ist

In den meisten Beispielen werden die Breite und Höhe des Popup-Fensters genau angegeben. Ich möchte, dass sie WRAP_CONTENT sind - da der Inhalt dinamisch bestimmt wird, also setze ich im Konstruktor -2 für Breite und Höhe und zeige es über showAsDropDown(Ansicht Anker)

Auf diese Weise wird das Popup immer unterhalb der Ankeransicht gezeichnet, was bedeutet, dass es außerhalb des Bildschirms gezeichnet werden kann. Das folgende Snippet demonstriert das Problem. Versuchen Sie, auf die letzte TextView zu klicken, und Sie werden kein PopupWindow sehen, da es außerhalb der Windows-Grenzen angezeigt wird. Warum funktioniert es nicht? Ich bemerke, dass die explizite Angabe der Dimensionen (z.B. 200, 100) das Problem nicht auslöst. Versuchen Sie es selbst

package com.zybnet.example.popupdemo;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.LinearLayout;
import android.widget.PopupWindow;
import android.widget.TextView;

public class PopupDemoActivity extends Activity implements OnClickListener {
    private PopupWindow popup;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // -2 means WRAP_CONTENT THIS TRIGGERS THE PROBLEM
        popup = new PopupWindow(getPopupContent(), -2, -2);
        // When you specify the dimensions everything goes fine
        //popup = new PopupWindow(getPopupContent(), 200, 100);

        LinearLayout layout = new LinearLayout(this);
        layout.setOrientation(LinearLayout.VERTICAL);

        // FILL_PARENT  and same layout weight for all children
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(-1, -1, 1);
        for (int i = 0; i < 10; i++) {
            TextView tv = new TextView(this);
            tv.setText("Click to show popup");
            tv.setOnClickListener(this);
            layout.addView(tv, params);
        }
        setContentView(layout);
    }

    @Override
    public void onClick(View view) {
        popup.dismiss();
        popup.showAsDropDown(view);
    }

    private View getPopupContent() {
        TextView popupContent = new TextView(this);
        popupContent.setText("Some text here");
        popupContent.setTextColor(Color.parseColor("#5000ae"));
        popupContent.setBackgroundColor(Color.parseColor("#ff00ff"));
        popupContent.setPadding(10, 20, 20, 10);
        return popupContent;
    }
}

12voto

Ivan Parfentev Punkte 119

Ich habe dieses Problem durch den Aufruf von measure() Methode in einer Popup-Inhaltsansicht:

View content = getPopupContent();

content.measure(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
int measuredHeight = content.getMeasuredHeight();

popup = new PopupWindow(content, ViewGroup.LayoutParams.WRAP_CONTENT, measuredHeight);

0voto

jaigish Punkte 149
final PopupWindow popupWindow = new PopupWindow();
// inflate your layout or dynamically add view
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.alert_reply_chat,null);

popupWindow.setFocusable(true);
popupWindow.setWidth(WindowManager.LayoutParams.WRAP_CONTENT);
popupWindow.setHeight(180);
popupWindow.setBackgroundDrawable(null);

popupWindow.setClippingEnabled(false);

popupWindow.setTouchable(true);
popupWindow.setContentView(view);

return popupWindow;

//Der obige Code funktioniert, ich habe ihn überprüft.

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