webentwicklung-frage-antwort-db.com.de

Android erhält die programmgesteuert erstellte Ansichtsbreite

Ich habe TextView so programmgesteuert erstellt:

                TextView mTextView = new TextView(getApplicationContext());

                final LayoutParams params = new TableLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
                ((MarginLayoutParams) params).setMargins(8, 8, 0, 0);

                mTextView.setText(mText);
                mTextView.setLayoutParams(params);
                mTextView.setPadding(2, 2, 2, 2);
                mTextView.setBackground(getResources().getDrawable(R.drawable.note_corps));

                tagMap.addView(mTextView);

                textViewsWidth = mTextView.getWidth();

MTextView.getWidth () gibt jedoch immer 0 zurück

Und wenn ich es versuche:

mTextView.getLayoutParams().width

Es gibt den entsprechenden Wert von LayoutParams in der Klasse LayoutParams zurück (-1 oder -2).

Wie kann ich die Breite der Ansicht erhalten?

EDITIch muss das hier tun:

            @Override
        public void onPostExecute(Hashtable<String, Integer> hash){
            final ScrollView tagMapScroll = (ScrollView) findViewById(R.id.tagMapScroll);
            final LinearLayout tagMap = (LinearLayout) findViewById(R.id.tagMap);
            final ArrayList<Integer> arr = new ArrayList<Integer>(hash.values());
            final Enumeration<String> e = hash.keys();
            int index = 0;
            int textViewsWidth = 0;

            while(e.hasMoreElements()){
                final TextView tV = new TextView(getApplicationContext());

                tV.setTextColor(Color.parseColor("#666666"));
                tV.setText(Html.fromHtml(randomColor() + e.nextElement()));
                tV.setTextSize(arr.get(index));

                final LayoutParams params = new TableLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
                ((MarginLayoutParams) params).setMargins(8, 8, 0, 0);

                tV.setLayoutParams(params);
                tV.setPadding(2, 2, 2, 2);
                tV.setBackground(getResources().getDrawable(R.drawable.note_corps));

                tagMap.addView(tV);

                textViewsWidth += tV.getWidth();

                index++;
            }

            tagMapScroll.setVisibility(ScrollView.VISIBLE);

        }

EDIT SOLUTION Ich habe diese Antwort von @ androiduser verwendet:

mTextView.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
                int width = mTextView.getMeasuredWidth();
                int height = mTextView.getMeasuredHeight();

Problem gelöst !

20
Pumpkin

Ich habe diese Lösung verwendet:

yourView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {

    @Override
    public void onGlobalLayout() {
        // Ensure you call it only once
        yourView.getViewTreeObserver().removeOnGlobalLayoutListener(this);

        // Here you can get the size :)
    }
});
15
Siddharth_Vyas

diesen Weg bekommen:

tV.post(new Runnable() {
                    @Override
                    public void run() {
                        int width=tV.getMeasuredWidth();
                    }
                });
3
shivang Trivedi

diese Werte sind konstante Werte für FILL_PARENT und WRAP_CONTENT. Wenn Sie die Ansichtsgröße überprüfen möchten, können Sie Folgendes versuchen:

tagMap.addView(mTextView);
tagMap.post(new Runnable() {
                    @Override
                    public void run() {
                        mTextView. getWidth();
                    }
                });

sie müssen warten, bis Android die TextView zeichnet. Auf diese Weise posten Sie ein Runable in der tagMap-Warteschlange, das hoffentlich ausgeführt wird, nachdem die Textansicht gezeichnet wurde (also sollte es Gewicht und Höhe sein). 

2
Blackbelt

In dieser Methode können Sie die Breite der Ansicht ablesen.

    @Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    int width = mTextView.getWidth();
    int height = mTextView.getHeight();
}

und definieren Sie TextView mTextView als global

1
kalyan pvs

Sie müssen die ViewTreeObserver-Klasse verwenden, mit der Listener registriert werden, die über globale Änderungen in der Ansichtsstruktur benachrichtigt werden können. Zu diesen globalen Ereignissen gehören das Layout des gesamten Baums, der Beginn des Zeichnungsdurchlaufs und die Änderung des Berührungsmodus. 

In der Aktivität onCreate von mehotd wurde folgendes eingefügt:

ViewTreeObserver vto = mTextView.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        mTextView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
        int viewWidth = mTextView.getMeasuredWidth();

    }
});
0
Diego Palomar