Autore Topic: Android Studio preview of custom Views  (Letto 379 volte)

Offline arlabs

  • Utente normale
  • ***
  • Post: 434
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS7
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Android Studio preview of custom Views
« il: 18 Marzo 2015, 18:56:02 CET »
0
Mi domando perché ho problemi a visualizzare le View customizzate nella LayoutPreview di AndroidStudio.
Mi è capitato con più di uno, qui riporto un esempio che non mi va.
In passato risolvevo mettendo tools:visibility="gone" a quella View, non la vedevo, ma almeno vedevo il resto.
Ora non funziona più nemmeno così.
Non mi dà  NESSUN errore, semplicemente selezionando il tab "design" non vedo nulla.
Sicuramente manca qualcosa, magari qualcuno di voi mi sa dire

Qui un pezzo del layout dove uso la custom View
Codice (XML): [Seleziona]
    <FrameLayout
       android:layout_width="fill_parent"
       android:layout_height="fill_parent"
       android:id="@+id/settings_external_layout">

        <com.arlabsmobile.utils.DebugTextView
           android:layout_width="match_parent"
           android:layout_height="match_parent"
           android:background="@color/transparent"
           android:id="@+id/debug_logs"
           android:textSize="10sp"/>

    </FrameLayout>


ma ho provato anche con:

Codice (XML): [Seleziona]
        <view
           android:layout_width="match_parent"
           android:layout_height="match_parent"
           class="com.arlabsmobile.utils.DebugTextView"
           android:background="@color/transparent"
           android:id="@+id/debug_logs"
           android:textSize="10sp"/>

Qui il codice della custom View, che altro non è che una TextView.
Ah, il codice sta in una libreria diversa dal modulo Applicazione dove la uso.

Codice (Java): [Seleziona]
package com.arlabsmobile.utils;

import android.content.Context;
import android.text.method.ScrollingMovementMethod;
import android.util.AttributeSet;
import android.widget.TextView;

import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Iterator;


public class DebugTextView extends TextView
{
    public static class Logger
    {
        private static ArrayList<WeakReference<DebugTextView>> mRegisteredTextView = new ArrayList<>();
        private static ArrayList<Integer> mLineLenght = new ArrayList<>();
        private static String mLogStrings = new String();
        private static final int MaxLineCounts = 100;

        static public void log( String string )
        {
            if( BuildConfig.DEBUG )
            {
                mLineLenght.add(string.length() + 1);
                if( mLineLenght.size() > 1 )
                    mLogStrings += "\n";
                mLogStrings = mLogStrings + string;
                if( mLineLenght.size() > MaxLineCounts )
                {
                    mLogStrings = mLogStrings.substring(mLineLenght.get(0));
                    mLineLenght.remove(0);
                }

                notifyTextViews();
            }
        }

        static private void registerTextView( final DebugTextView listener )
        {
            listener.setText(mLogStrings);
            mRegisteredTextView.add(new WeakReference<DebugTextView>(listener));
        }

        static private void unregisterTextView( final DebugTextView listener )
        {
            for (Iterator<WeakReference<DebugTextView>> iterator = mRegisteredTextView.iterator(); iterator.hasNext();)
            {
                WeakReference<DebugTextView> refListener = iterator.next();
                if( refListener.get() == listener )
                {
                    iterator.remove();
                    break;
                }
            }
        }

        static private void notifyTextViews()
        {
            for( Iterator<WeakReference<DebugTextView>> iterator = mRegisteredTextView.iterator(); iterator.hasNext(); )
            {
                WeakReference<DebugTextView> refListener = iterator.next();
                DebugTextView listener = refListener.get();
                if( listener == null )
                {
                    iterator.remove();
                }
                else
                {
                    listener.setText(mLogStrings);
                }
            }
        }
    }

    public DebugTextView(Context context)
    {
        super(context);
        init();
    }

    public DebugTextView(Context context, AttributeSet attrs)
    {
        super(context, attrs);
        init();
    }

    public DebugTextView(Context context, AttributeSet attrs, int defStyle)
    {
        super(context, attrs, defStyle);
        init();
    }

    void init()
    {
        setMaxLines( Logger.MaxLineCounts );
        setVerticalScrollBarEnabled( true );
        setMovementMethod(new ScrollingMovementMethod());
    }

    @Override
    protected void onAttachedToWindow()
    {
        super.onAttachedToWindow();

        if( BuildConfig.DEBUG )
        {
            Logger.registerTextView(this);
        }
        else
        {
            setVisibility( GONE );
        }
    }

    @Override
    protected void onDetachedFromWindow()
    {
        if( BuildConfig.DEBUG )
        {
            Logger.unregisterTextView(this);
        }

        super.onDetachedFromWindow();
    }
}