Views durchblättern / scrollen

  • 8 Antworten
  • Letztes Antwortdatum
L

lis@

Neues Mitglied
0
viele kennen bestimmt die Blätterfunktion bei Nachrichtenapps wie Stern, Appy Geek (neu), n-tv, ... Sprich, man zieht den Artikel nach rechts/links und es erscheint der nächste Artikel. Lässt man mitten drin los, scrollt ab einem gewissen Schwellwert (z.B. wenn > 50%) der entsprechende Artikel komplett ins Bild (in dem mittleren Bild habe ich losgelassen).
Ich brauche keine Scrollanimation wie z.B. Blättern, ich möchte nur die Artikel durchscrollen können. Evtl. setze ich das auch mit Bildern um, welche eine unterschiedliche Breite besitzen.

Nun meine Frage: wie kann man einzelne views so durchscrollen OHNE die x Werte jedes mal neu auszurechnen? Bzw. wenn das nicht geht, was wäre eine sinnvolle alternative?

2013-04-08 09.49.10.png 2013-04-08 09.49.14.png 2013-04-08 09.49.18.png
 
danke, das ist wohl genau das, was ich gesucht habe, manchmal fehlen mir einfach noch die Stichworte :)
 
Also ich steh ein bisschen auf dem Schlauch (sorry, bin wohl noch ein ziemlicher Anfänger...)
Das Bsp. mit dem Loremipsum Text konnte ich nachbauen, allerdings versteh ich nicht ganz, wie ich die Views manipuliere, zumindest mal den Text verändern.
Das müsste doch irgendwo im ScreenSlidePageFragment möglich sein?
Code:
ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment_screen_slide_page, container, false);
Da es sich bei mir um WebViews statt ScrollViews bei den einzelnen Fragmenten handelt, müsste ich hier irgendwie die url können, oder? Aber wie greif ich auf die view zu?

edit:
was ist der Unterschied zur SwipeView, abgesehen davon, dass ich eine zusätzliche Masterview habe?
http://developer.android.com/training/implementing-navigation/lateral.html
 
Zuletzt bearbeitet:
ok, ich habe das obere Problem gelöst und es funktioniert echt gut jetzt.

Sobald man auf ein Thumbnail klickt werden LinearLayouts, die u.a. das Bild als Detailbild beinhalten, als Fragmente angezeigt. Geht man allerdings von der Detailansicht auf zurück und klickt dann nochmals auf ein Thumbnail, kommt folgender Fehler:
Code:
java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
Mein Code im Fragment:

Code:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
	ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment_detailed_image, container, false);
	// Veränderungen an der View vornehmen
	Bundle args = getArguments();
	int position = args.getInt("position");
	LinearLayout ll = ((LinearLayout) rootView.findViewById(R.id.detailedImageLinearLayout));
	// images ist eine ArrayList von Image (eigener Datentyp)
	Image image = GalleryActivity.images.get(position);
	// image.getDetailedImage() liefert ein LinearLayout mit Bild, Text und Hintergrund
	ll.addView(image.getDetailedImage());
	return rootView;
}
Da bin ich jetzt wirklich am Ende meines Wissens :sad:

--edit--
der Fehler tritt in der Zeile
ll.addView(image.getDetailedImage());
auf
 
keine ahnung, ich hab nun gerade leider kein eclipse vor mir wo android drauf ist ...

aber hast du es mal versucht vor besagter zeile ein image.removeView() aufzurufen?
 
Image ist ja nur ein Objekt.
Ich hab mal
Code:
ll.removeAllViews();
ausprobiert, was aber nichts geändert hat... bei der Methode
Code:
ll.removeView(View view)
wusste ich nicht, welche view ich als Parameter übergeben muss.
 
In der Methode getdetailed... Versuch es dort mal ...


Sent from my iPhone using Tapatalk
 
Sorry, das ist irgendwie so kompliziert... Ich lade die Bilder (und deren ImageViews) schon in einer vorherigen Activity (GalleryActivity) in einem AsyncTask.
Die Image Klasse hat nur ein paar Methoden zum Laden der Bilder und zum Zurückgeben:
Code:
package de.schwaebische_post.schwaepo_app.models;

import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Log;
import android.view.Gravity;
import android.view.ViewGroup.LayoutParams;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

public class Image
{
	private int id;
	private String title;
	private String description;
	private String urlThumbnail;
	private String urlBigPic;
	private int width;
	private int gallery;

	private ImageView imageView;
	private LinearLayout detailedImage;

	private final static int IMAGE_THUMBNAIL_PADDING = 20;
	public final static int IMAGE_BIGPIC_PADDING = 20;
	private final static int IMAGE_DETAILIMAGE_BACKGROUND = android.R.color.darker_gray;

	public int getId()
	{
		return id;
	}

	public void setId(int id)
	{
		this.id = id;
	}

	public String getTitle()
	{
		return title;
	}

	public void setTitle(String title)
	{
		this.title = title;
	}

	public String getDescription()
	{
		return description;
	}

	public void setDescription(String description)
	{
		this.description = description;
	}

	public String getUrlThumbnail()
	{
		return urlThumbnail;
	}

	public void setUrlThumbnail(String urlThumbnail)
	{
		this.urlThumbnail = urlThumbnail;
	}

	public String getUrlBigPic()
	{
		return urlBigPic;
	}

	public void setUrlBigPic(String urlBigPic)
	{
		this.urlBigPic = urlBigPic;
	}

	/**
	 * erstellt die ImageViews in der Thumbnailansicht
	 * 
	 * @param context
	 * @return
	 */
	public void loadThumbnailAsImageView(Context context)
	{
		Bitmap bitmap = null;
		try
		{
			// Bild von URL laden
			bitmap = BitmapFactory.decodeStream((InputStream) new URL(
					getUrlThumbnail()).getContent());
		} catch (MalformedURLException e)
		{
			Log.e("Image#loadThumbnailAsImageView(Context context)", "catch: "
					+ e.toString());
		} catch (IOException e)
		{
			Log.e("Image#loadThumbnailAsImageView(Context context)",
					"Bitmap erstellen: " + e.toString());
		}
		// Bild erstellen
		// TODO abfangen, ob bitmap == null ist
		imageView = new ImageView(context);
		imageView.setPadding(IMAGE_THUMBNAIL_PADDING, IMAGE_THUMBNAIL_PADDING,
				IMAGE_THUMBNAIL_PADDING, IMAGE_THUMBNAIL_PADDING);
		imageView.setId(getId());
		imageView.setImageBitmap(bitmap);
	}

	public void loadDetailImageAsLinearLayout(Context context)
	{
		detailedImage = new LinearLayout(context);
		detailedImage.setPadding(IMAGE_BIGPIC_PADDING, IMAGE_BIGPIC_PADDING,
				IMAGE_BIGPIC_PADDING, IMAGE_BIGPIC_PADDING);
		detailedImage.setOrientation(LinearLayout.VERTICAL);
		detailedImage.setLayoutParams(new LayoutParams(
				LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
		detailedImage.setBackgroundResource(IMAGE_DETAILIMAGE_BACKGROUND);
		detailedImage.setGravity(Gravity.CENTER_VERTICAL
				| Gravity.CENTER_HORIZONTAL);
		Bitmap bitmap = null;
		try
		{
			// Bild von URL laden
			bitmap = BitmapFactory.decodeStream((InputStream) new URL(
					getUrlBigPic()).getContent());
		} catch (IOException e)
		{
			Log.e("Image#loadDetailImageAsLinearLayout(Context context)", "catch: " + e.toString());
		}
		// TODO abfangen, ob bitmap == null ist
		// Bild erstellen
		ImageView iv = new ImageView(context);
		iv.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,
				LayoutParams.WRAP_CONTENT));
		iv.setContentDescription("contentDescription");
		iv.setImageBitmap(bitmap);
		// Bildunterschrift erstellen
		TextView tv = new TextView(context);
		tv.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,
				LayoutParams.WRAP_CONTENT));
		tv.setText(getTitle() + " : " + getDescription());

		// alles in LinearLayout schreiben
		detailedImage.addView(iv);
		detailedImage.addView(tv);
	}

	public ImageView getImageView()
	{
		return imageView;
	}

	public LinearLayout getDetailedImage()
	{
		return detailedImage;
	}

	public int getWidth()
	{
		return width;
	}

	public void setWidth(int width)
	{
		this.width = width;
	}

	public int getGallery()
	{
		return gallery;
	}

	public void setGallery(int gallery)
	{
		this.gallery = gallery;
	}

}

und im AsyncTask der GalleryActivity:
Code:
@Override
protected Boolean doInBackground(String... string)
{
    for (Image image : images)
    {
        image.loadThumbnailAsImageView(context);
        image.loadDetailImageAsLinearLayout(context);
    }
    return true;
}
(images gehört zur GalleryActivity: public static ArrayList<Image> images;)
 
Zurück
Oben Unten