Listview über SurfaceView legen in Framelayout

  • 7 Antworten
  • Neuester Beitrag
Diskutiere Listview über SurfaceView legen in Framelayout im Android App Entwicklung im Bereich Betriebssysteme & Apps.
Jaiel

Jaiel

Experte
Hallo brauche ein paar Tipps von denen die sich mit XML und Listviews im speziellen gut auskennen.

Habe eine SurfaceView die ich in ein Framelayout lade.

So
Code:
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if(savedInstanceState==null)
        {
            requestWindowFeature(Window.FEATURE_NO_TITLE);
           getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                              WindowManager.LayoutParams.FLAG_FULLSCREEN);
           setContentView(R.layout.main);
         
           mView=new MainView(this);

            lLayout = (FrameLayout)findViewById(R.id.main);

            mView.setLayoutParams(new FrameLayout.LayoutParams(
                    FrameLayout.LayoutParams.MATCH_PARENT,
                    FrameLayout.LayoutParams.MATCH_PARENT));

            lLayout.addView(mView);
        }
    }

So weit so gut. Jetzt möchte ich ncoh da eine Listview reinladen.

Dafür möchte ich die Dimensionen und positionen programmatisch setzen(habe ich schon alles in Pixelform vorhanden das ist nciht das Problem)
Die Textgrößen setzen(pixel werte...alles vorhanden in Pixel)

Und ausserdem muss ich während der Laufzeit und zum Anfang die Textviews dort programmatisch einfügen.
Das wäre wohl kein Problem mit der addView Methode dann oder?)

Kann mich da mal jemand beraten bitte?


Vielen Dank im Voraus!!!
 
missspelled

missspelled

App-Anbieter (In-App)
Hi,
ListView ohne Adapter ist immer schlecht..
So ganz bin ich noch nicht dahinter gestiegen was der Sinn der Sache ist, bzw. was am Ende dabei rauskommen soll :p
Vielleicht wäre eine RecyclerView auch eine Alternative?
 
Jaiel

Jaiel

Experte
Ich hab das jetzt schon gelöst...und zwar ja mit einem Adapter<String> Hab jetzt darauf ausgerichtet dass ich einfach nur eine Textview habe die ich mit einem String befülle.

(Bild im Anhang)
Beim buttonclick kommt einfach die Listview mit der Textview drinne aus dem linken Bereich geschlittert und fährt dorthin wieder zurück. Dafür berechne ich in einem Thread seine Positionen. Die Surfaceview wird programmatisch hinzugefügt diese ist nciht in der LAyout datei enthalten. Ich muss die Listview in den VorderGrund bringen da die SurfaceView sich drüber legt weil sie ja erst später in Code hinzugefügt wird

hier die onCreate zu der Activity:

Code:
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if(savedInstanceState==null)
        {
            requestWindowFeature(Window.FEATURE_NO_TITLE);
            getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                                 WindowManager.LayoutParams.FLAG_FULLSCREEN);
            setContentView(R.layout.main);
            ...
            mView=new MainView(this);
        
            frameLayout = (FrameLayout)findViewById(R.id.main);
            lView=(ListView)findViewById(R.id.listview);

            stringArray[0]="\n";

            adapter = new ArrayAdapter<String>(this,
                    R.layout.main, R.id.textview, stringArray);
            lView.setAdapter(adapter);
        
            setHintList();
        
            loadSharedPrefs();
            updateHintList();

            mView.setLayoutParams(new FrameLayout.LayoutParams(
                    FrameLayout.LayoutParams.MATCH_PARENT,
                    FrameLayout.LayoutParams.MATCH_PARENT));
        
            frameLayout.addView(mView);
            lView.bringToFront();
        
        }
    }
Hier die LAyout.xml:

Code:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    android:id="@+id/main">

    <ListView
        android:id="@+id/listview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:divider="@null"
        android:dividerHeight="0dp">
    </ListView>

    <TextView
        android:id="@+id/textview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:textColor="#000000"
        android:textStyle="bold"/>
</FrameLayout>

und heirsetze ich die Position der Listview im mainthread( man beachte die professionelle Referenzierung und Verstrickung unter der View der Activity und dem Thread :p). Der Nachteil dieser Vorgehensweise ist dass ich das in einem Try catch Block ausführen muss sonst stürzt er ab da ich hier etwas mit der SurfaceView hacke und es schmeißt einen error wenn ich das ausführe just in dem Moment während sich das Surface aufbaut nachdem man die App verlassen udn wiedergekommen ist:

Code:
                        //berechne seine X position und setze sie dann hier
                        mView.mAct.lView.setX(hintListPosX);
                        mView.mAct.runOnUiThread(new Runnable()
                        {
                            public void run()
                            {
                                mView.mAct.adapter.notifyDataSetChanged();
                            }
                        });

hier die initialisierung der position:

Code:
private void initAll()
    {
    
    
        hintListWidth=(int)(screenWidth*0.15f);
        hintListHeight=(int)(screenHeight*0.6f);
        hintListPosX=-hintListWidth;
        hintListPosY=screenHeight*0.2f;
        hintListVelocity=-hintListWidth/200f;
        rightBoundX=hintListWidth*0.1f;
        leftBoundX=-hintListWidth;
    
        mView.mAct.lView.setLayoutParams(new FrameLayout.LayoutParams(hintListWidth,hintListHeight));

        mView.mAct.lView.setX(hintListPosX);
        mView.mAct.lView.setY(hintListPosY);

Ich berechne die Dimensionen lieber im Code damit ich mich nciht mit dp rumschlagen muss und so eine bessere Kontrolle über mein LAyout habe auch wenn viele xml bevorzugen aber ich bin da ncoh nicht so firm darin


Zum Bild: Ganz links ist das LAyout das von links ausserhalb des Bildschirms hineingeschlittert kommt

Ist jetzt auch nciht das endgültige Aussehen der Elemente ist nur zu testzwecken aber das versteht sich doch hoffentlich auch ;)
 

Anhänge

missspelled

missspelled

App-Anbieter (In-App)
Nice! So Sachen sind meist gar nicht so einfach, bzw. kann man daran schon mal das ein oder andere Nächtlein dran sitzen^^
Sieht auf jeden Fall schön "custom" aus. :)
 
Jaiel

Jaiel

Experte
also ganz ehrolich im code ist mri das lieber irgendwie...am liebsten hätte ich das ganze Layout und die view elemente im Code aufgebaut aber in xml geht das wirklich einfacher...

Mir ist auch grad was aufgefallen. Dass ich die domensionen der mainView gar nciht zu setzen brauch aber naja egal sicher ist sicher es sollen ja alle views mindestens ein width und height bekommen.

Wie ist denn das so? Ist die width und height standard mäßig schon auf vollbild gesetzt zumindest bei der surfaceview?
 
missspelled

missspelled

App-Anbieter (In-App)
srollbar="none" oder so müsste das sein :p
 
Jaiel

Jaiel

Experte
Hallo sry das ich mich nicht gemeldet habe:
Ja es hat auch hingehauen als erstes habe ich es einfachso kopiert aber da fehlte das s für:

android:scrollbars="none" aber hat super geklappt, danke dir :)
 
Ähnliche Themen - Listview über SurfaceView legen in Framelayout Antworten Datum
2
4
0