viewPager - XML-Dateien per Java befüllen

  • 16 Antworten
  • Letztes Antwortdatum
M

Manuel1805

Ambitioniertes Mitglied
2
Hallo zusammen,

ich möchte in meiner App einen viewPager (5-10 Seiten zum sliden) implementieren. Die einzelnen Elemente (TextViews, Buttons...) habe ich bereits in XML-Dateien angelegt. Da ich die Texte mit Java (Html.tohtml) schöner als in der XML-Datei gestalten kann möchte ich die vorhanden Elemente per Code befüllen. Hier fängt das Problem an. Ich habe schon alles mögliche probiert und komme zu keiner Lösung, auch die Internetrecherche blieb erfolglos :drool:

Anbei meine beiden entscheidenden Klassen:

Ich hatte versucht in der Klasse BestandskontenPageAdapter den Code zu implemtieren...

PageAdapter:
Code:
package de.manuel.buchenfueranfaenger;

import android.content.Context;
import android.os.Parcelable;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;

public class BestandskontenPageAdapter extends PagerAdapter {
	// ---Die Anzahl aller Seiten zurückgeben---
	public int getCount() {
		return 4;
	}

	public Object instantiateItem(View collection, int position) {
		LayoutInflater inflater = (LayoutInflater) collection.getContext()
				.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

		int resId = 0;
		switch (position) {
		case 0:
			resId = R.layout.bestandskonten;
			break;
		case 1:
			resId = R.layout.bestandskonten1;
			break;
		case 2:
			resId = R.layout.bestandskonten2;
			break;
		case 3:
			resId = R.layout.bestandskonten3;
			break;

		}

		View view = inflater.inflate(resId, null);
		((ViewPager) collection).addView(view, 0);
		return view;
	}

	@Override
	public void destroyItem(View arg0, int arg1, Object arg2) {
		((ViewPager) arg0).removeView((View) arg2);
	}

	@Override
	public boolean isViewFromObject(View arg0, Object arg1) {
		return arg0 == ((View) arg1);
	}

	@Override
	public Parcelable saveState() {
		return null;
	}
}

Fragment:

Code:
package de.manuel.buchenfueranfaenger;

import android.app.Fragment;
import android.os.Bundle;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class Bestandskonten extends Fragment {
	
	
		public Bestandskonten() {

		}

		@Override
		public View onCreateView(LayoutInflater inflater, ViewGroup container,
				Bundle savedInstanceState) {

			View view = inflater.inflate(R.layout.start_kapitel, container, false);

			// ViewPager initialisieren
			EinstiegPageAdapter adapter = new EinstiegPageAdapter();
			ViewPager viewPager = (ViewPager) view.findViewById(R.id.viewPager);
			viewPager.setAdapter(adapter);
			// starte mit erstem Layout
			viewPager.setCurrentItem(0);

			return view;

		}

	}

Hat jemand eine Idee / Tipp wie ich das Problem lösen kann?
 
Code:
LayoutInflater inflater = context.getLayoutInflater();
View v = inflater.inflate(R.layout.BUTTON_XML, null);
Button b = (Button) v.findViewById(R.id.button_id_from_BUTTOM_XML);

b.setText("Hallo");
b.setBackgroundColor(Color.Cyan);
...
 
Hallo StefMa!
Vielen Dank für Deine schnelle Antwort.
Ich habe die (hoffentlich) richtige Stelle mit deinem Vorschlag ausgetauscht. Nun wird bei "context" folgender Fehlerhinweis ausgegeben: "context cannot be resolved".


/*
* LayoutInflater inflater = (LayoutInflater) collection.getContext()
* .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
*/

LayoutInflater inflater = context.getLayoutInflater();
View v = inflater.inflate(R.layout.bestandskonten, null);
TextView tv = (TextView) v.findViewById(R.id.bestand_titel);

tv.setText("Hallo");



Wie kann ich die weiteren Seiten ansprechen? nach tv.setText... folgenden Code einfügen?

View v = inflater.inflate(R.layout.bestandskonten1, null);
TextView tv1 = (TextView) v.findViewById(R.id.bestand1_titel);

tv1.setText("Hallo1");
 
Das war Pseudo-Code :D Zumindest so halb.
Code:
LayoutInflater inflater = (LayoutInflater) collection.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE) ;
War schon richtig - eventuell ^^

Du musst halt vom context den LayoutInflater (also getSystemService) aufrufen. Keine Ahnung was bei dir der Context ist, deshalb kann ich dir da nicht helfen.
(Im Notfall kannst du auch beim Instanziieren vo PageAdapter den Context der Activity mitgeben und dann benutzten).

Code:
View v = inflater.inflate(R.layout.bestandskonten1, null);
TextView tv1 = (TextView) v.findViewById(R.id.bestand1_titel);

tv1.setText("Hallo1");
Ja, sollte genauso funktionieren...

Gruß
 
Sorry, dass ich noch mal schreibe...

Der folgende Code erzeugt keinen Fehler mehr. Allerdings bleibt das Layout leer.
Im Layout "bestandskonten.xml" existieren die Textviews "bestand_titel" und "bestand_inhalt". Leider weiß ich nicht warum diese nicht mit Text befüllt werden? :confused2:


Code:
LayoutInflater inflater = (LayoutInflater) collection.getContext()
				.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
		View v = inflater.inflate(R.layout.bestandskonten, null);
		TextView tv = (TextView) v.findViewById(R.id.bestand_titel);
		tv.setText("Hallo");
		TextView tv1 = (TextView)v.findViewById(R.id.bestand_inhalt);
		tv1.setText("Inhalt");
 
Der Code ändert ja auch nur den Text in einem Layout. Heißt nicht dass er auch im Fragment angezeigt wird. Dies must du dme Fragment natürlich auch sagen, dass jetzt R.layout.bestandskonten angezeigt werden soll...

Gruß

€dit: http://s.stefma.ws/65d9d7
 
Das gewünschte Layout wird angezeigt, inkl. aller enthaltenen Elemente wie ImageViews, TextViews. Lediglich die TextViews bei den kein Text steht und die via ...setText gefüllt werden sollen erscheinen nicht :drool:

Die XML sieht wie folgt aus:
Code:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:paddingBottom="8dp"
        android:paddingLeft="8dp"
        android:src="@drawable/folien" />

    <TextView
        android:id="@+id/bestand_seiten"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_toRightOf="@+id/bestand_titel"
        android:paddingBottom="8dp"
        android:paddingLeft="8dp"
        android:text="10 Folien" />

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:paddingBottom="8dp"
        android:paddingRight="8dp"
        android:src="@drawable/zeit" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:paddingBottom="8dp"
        android:paddingRight="8dp"
        android:text="Lerndauer ca 15 min" />

    <Space
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/sinn_inhalt"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="92dp" />

    <TextView
        android:id="@+id/bestand_inhalt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="188dp"
        android:gravity="center_vertical|center_horizontal"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:textSize="20sp" />

    <TextView
        android:id="@+id/bestand_titel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:gravity="center_horizontal"
        android:padding="8dp"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:textStyle="bold" />

</RelativeLayout>

Und der Code im PageAdapter sieht so aus:
Code:
public View instantiateItem(View collection, int position) {
		

		LayoutInflater inflater = (LayoutInflater) collection.getContext()
				.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
		View v = inflater.inflate(R.layout.bestandskonten, null);
		TextView tv = (TextView) v.findViewById(R.id.bestand_titel);
		tv.setText("Hallo");
		TextView tv1 = (TextView) v.findViewById(R.id.bestand_inhalt);
		tv1.setText("Inhalt");

		int resId = 0;
		switch (position) {
		case 0:
			resId = R.layout.bestandskonten;

			break;
		case 1:
			resId = R.layout.bestandskonten1;
			break;
		case 2:
			resId = R.layout.bestandskonten2;
			break;
		case 3:
			resId = R.layout.bestandskonten3;
			break;

		}

		View view = inflater.inflate(resId, null);
		((ViewPager) collection).addView(view, 0);

		
			
		

		return view;

	}

Bei meinen anderen Fragments (ohne viewPager) ist das befüllen der TextViews u.ä. via Code kein Problem... Da benutze ich in der OnCreateView-Methode folgenden Code:
Code:
View view = inflater.inflate(R.layout.fragment_start_seite, container,
				false);

		titel = (TextView) view.findViewById(R.id.starttitel);
		inhalt = (TextView) view.findViewById(R.id.startinhalt);
		bild = (ImageView) view.findViewById(R.id.startbild);

		titel.setText("Buchen für Anfänger");
		inhalt.setText("Herzlich willkommen zum Bilanz- und Buchführungstraining");
		bild.setImageResource(R.drawable.startbild);

Vielleicht gibts noch den entscheidenden Hinweis/Tipp...
Vielen Dank schon mal für die vielen Informationen.
 
Manuel1805 schrieb:
Das gewünschte Layout wird angezeigt, inkl. aller enthaltenen Elemente wie ImageViews, TextViews. Lediglich die TextViews bei den kein Text steht und die via ...setText gefüllt werden sollen erscheinen nicht :drool:


Wie schon einen Beitrag vorher von mir geschrieben: Du musst das neue Layout schon setzten. Was du derzeit machst:
Code:
-> Layout1 setzten
-> Layout1 anzeigen
-> Layout2 holen
-> Layout2 TextView holen
-> Layout2 TextView ändern
Was fehlt?
 
-> Layout1 setzten
-> Layout1 anzeigen
-> Layout2 holen
-> Layout2 TextView holen
-> Layout2 TextView ändern

-> Layout2 anzeigen?

Ich war der Meinung dass ich das Layout2 anzeige durch:

Code:
View view = inflater.inflate(resId, null);
		((ViewPager) collection).addView(view, 0);

	return view;
	}

...anscheinend habe ich da ein Verständnisproblem. Kannst Du mir sagen welcher Part für das Anzeigen zuständig ist?

Vielen Dank! :thumbup:
 
Zur zeit heißt deine Methode

Code:
public View instantiateItem(View collection, int position)

Du überschreibst die Methode
Code:
public Object instantiateItem(View collection, int position)

Wenn du mit Fragmente arbeitest solltest du lieber ein FragmentPagerAdapter oder ein FragmentStatePagerAdapter benutzen.
 
Hallo markus.tullius,

die Änderung des Ausgabedatentyp "View" in "Object" hat nicht zum gewünschten Erfolg geführt.

...StefMa hatte geschrieben, dass ich das Layout setzen und anzeigen muss. Nur weiß ich nicht was ich tun muss?:confused2:
 
Manuel1805 schrieb:
Ich war der Meinung dass ich das Layout2 anzeige durch:

Code:
View view = inflater.inflate(resId, null);
		((ViewPager) collection).addView(view, 0);

	return view;
	}

...anscheinend habe ich da ein Verständnisproblem. Kannst Du mir sagen welcher Part für das Anzeigen zuständig ist?
Ja, das stimmt auch. Dieser Part setzt das Layout. Ich versuche dir es mal anhand eines Bildes verständlich zu machen (Siehe Anhang).

Noch fragen?
 

Anhänge

  • x.png
    x.png
    16,6 KB · Aufrufe: 192
Wow. Super Erklärung! :thumbsup:
...Leider fehlt mir aber immer noch der entscheidende Punkt: Wie sage ich dem Computer benutze das Layout, welches per Code befüllt wurde?
 
In deinem switch case holst du dir doch schon dein Layout. nachdem du dieses ausgeführt hast, kannst du dein textview holen und ändern. Dieses layout gibst du auch zurück! Dann funktioniert es...

Gesendet von meinem Nexus 4 mit der Android-Hilfe.de App
 
Hallo StefMa,

ich nehme an, dass ich den Code wie folgt abändern muss:

Code:
public Object instantiateItem(View collection, int position) {

		LayoutInflater inflater = (LayoutInflater) collection.getContext()
				.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

		View v = inflater.inflate(R.layout.bestandskonten, null);
		
		int resId = 0;
		switch (position) {
		[B]case 0:
			
			TextView tv = (TextView) v.findViewById(R.id.bestand_titel);
			tv.setText("Hallo");
			TextView tv1 = (TextView) v.findViewById(R.id.bestand_inhalt);
			tv1.setText("Inhalt");
			
			resId = R.layout.bestandskonten;
			
			break;[/B]
		case 1:
			resId = R.layout.bestandskonten1;
			break;
		case 2:
			resId = R.layout.bestandskonten2;
			break;
		case 3:
			resId = R.layout.bestandskonten3;
			break;

		}

		View view = inflater.inflate(resId, null);
		((ViewPager) collection).addView(view, 0);

		return view;

	}

Es wird kein Fehler generiert...allerdings bleibt die Ansicht auch leer :drool:
Habe ich etwas falsch gemacht?:confused2:
 
Code:
public Object instantiateItem(View collection, int position) {

int resId = 0;
switch (position) {
[B]case 0:

resId = R.layout.bestandskonten;

break;[/B]
case 1:
resId = R.layout.bestandskonten1;
break;
case 2:
resId = R.layout.bestandskonten2;
break;
case 3:
resId = R.layout.bestandskonten3;
break;

}

View view = inflater.inflate(resId, null);

If(resId.equals(R.layout.bestandskonten)) {
TextView tv1 = (TextView) view.findViewById(R.id.bestand_inhalt);
tv1.setText("Inhalt");
} 
((ViewPager) collection).addView(view, 0);

return view;

}



Gesendet von meinem Nexus 4 mit der Android-Hilfe.de App
 
  • Danke
Reaktionen: Manuel1805
Hallo StefMa!
Vielen Dank!! Du bist echt der Beste!
 

Ähnliche Themen

AnnaBauer21
Antworten
0
Aufrufe
487
AnnaBauer21
AnnaBauer21
D
Antworten
8
Aufrufe
763
jogimuc
J
S
Antworten
7
Aufrufe
1.197
Silvasurf
S
AnnaBauer21
Antworten
6
Aufrufe
986
AnnaBauer21
AnnaBauer21
Zurück
Oben Unten