Button animieren in einem Fragment (ViewPager)

M

Manuel1805

Ambitioniertes Mitglied
2
Hallo zusammen,

kann mir jemand sagen wie ich eine Animation, z.B. kurzzeitiges verkleinern eines Buttons in einem Fragment verwirkliche?


Mein Code funktioniert leider nicht.

XML-Datei button_gedrueckt:
Code:
<?xml version="1.0" encoding="utf-8"?>
<scale  xmlns:android="http://schemas.android.com/apk/res/android"    
 android:fromXScale="1"
 android:toXScale="0.8"
 android:fromYScale="0.8"
 android:toYScale="0"
 android:pivotX="50%"
 android:pivotY="50%"
 android:duration="250"
 android:interpolator="@android:anim/overshoot_interpolator"
 />

Code:
final Animation animScale = AnimationUtils.loadAnimation(this, R.anim.button_gedrueckt);

findViewById(R.id.antwort1).startAnimation(animScale)


Folgende Fehlermeldung wird ausgeworfen:

The method loadAnimation(Context, int) in the type AnimationUtils is not applicable for the arguments (SinnPageAdapter, int)


Hintergrundinformation: Ich möchte eine Hintergrundgrafik in einem Button oder ImageButton implementieren. Wenn man diesen drückt sieht man leider keinen Drückeffekt.
 
Dann sieh dir doch die Fehlermeldung genau an, da steht doch was das Problem ist.
Vermutlich hast du eine Innere Klasse inder dein Code steht oder aber dein SinnPageAdapter ist eine eigene Klasse.

Und loadAnimation braucht einen Context als 1. Parameter.

versuchst mal mit getApplicationContext() statt this
 
Hallo amfa,
danke für Deine Antwort. Ich habe Deinen Vorschlag (getApplicationContext() ) umgesetzt. Leider mit dem gleichen Ergebnis (Fehlermeldung identisch).

Ich verwenden einen ViewPager... und versuche innerhalb des PageAdapters die einzelnen Objekte anzusprechen...


Code:
public class Sinn extends Fragment {

	public Sinn() {

	}

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

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

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

		return view;

	}

}


Code:
public class SinnPageAdapter extends PagerAdapter {

	// ---Die Anzahl aller Seiten zurückgeben---
	public int getCount() {
		return 5;
	}

	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.sinn;

			break;


Code:
else if (resIdInteger.equals(R.layout.test_4_button)) {

		}

		else if (resIdInteger.equals(R.layout.buchung_konten_test)) {
			Button antwort1 = (Button) view.findViewById(R.id.antwort1);
			
			antwort1.setOnClickListener(new OnClickListener() {

				@Override
				public void onClick(View v) {
					animieren(v);
				}
			});
		}


Code:
public void animieren(View view){
		final Animation animScale = AnimationUtils.loadAnimation(getApplicationContext(),
				R.anim.button_gedrueckt);
		view.findViewById(R.id.antwort1).startAnimation(animScale);

	}

Vielleicht hast Du noch einen Tipp wie ich das Problem lösen kann.


Ich muss mir die Klassenbeschreibung noch mal intensiv durchlesen. Gibt es außerhalb der Google-Beschreibung weitere (wenn möglich deutsche) Informationen zur Klasse Context?
 
Ich glaube nicht,
Die Google Doku ist der Standard.
Was willst du denn über die Klasse Context wissen?
Der Context ist im Prinzip das "Drumherum" deiner App, jeder Activity hat bzw ist ein Context.
Guck dir mal die Klassen Hierachy an:
Code:
java.lang.Object
   	android.content.Context
 	   	android.content.ContextWrapper
 	 	   	android.view.ContextThemeWrapper
 	 	 	   	android.app.Activity

Du musst also deinen aktuellen Application Context bis in deine animieren Methode bekommen.

DU könntest z.B. wenn du den SinnAdapter erstellst:
SinnPageAdapter adapter = new SinnPageAdapter();

Hier den Contest mit übergeben.
Da bist du ja in einem Fragment das sollte eigentlich mit this.getActivity() seine Activity zurück geben.

Dann baust du dir noch einen passenden Constructor in deinen SinnPageAdapter mit passender Membervariable:

Context context;

public SinnPageAdapter(Context context) {
this.context = context
}

und schon hast du Zugriff auf den Context.

DU könntest aber auch den ganzen OnClickListener woanders unterbringen z.B. direkt in der Activity.

antwort1.setOnClickListener(deineActivity).

Dazu müsste diese natürlich das passende Interface implementieren.

Und statt dem Context übergibst du dem SinnPagerAdapter halt ein OnLickListener Object (in dem Fall auch deine Activity wenn diese das Implementiert.)

Grundsätzlich musst du halt dein Context Objekt bis dahin bekommen wo du loadAnimation aufrufst
 
Hallo amfa,
super Erklärung! Danke schön. Ich muss Dich leider noch mal was fragen...

Nach Implementierung Deines 1. Vorschlags entfällt der Compilerfehler. :thumbup:
Jetzt habe ich nur noch eine NullPointerException (beim OnClicklistener):drool:
Wie kann ich das Problem lösen?

Mein PageAdapter schaut nun wie folgt aus:

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 Sinn extends Fragment {

	public Sinn() {

	}

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

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

		// ViewPager initialisieren
		SinnPageAdapter adapter = [B]new SinnPageAdapter(this.getActivity());[/B]
		ViewPager viewPager = (ViewPager) view.findViewById(R.id.viewPager);
		viewPager.setAdapter(adapter);
		// starte mit erstem Layout
		viewPager.setCurrentItem(0);

		return view;

	}

}


Die Veränderugen im Code der entscheidenden Klasse:

Constructor und die Variabel context
Code:
public class SinnPageAdapter extends PagerAdapter {

	Context context;

	public SinnPageAdapter(Context context) {
		this.context = context;
	}

OnClicklistener mit Aufruf der Methode "animieren"
Code:
else if (resIdInteger.equals(R.layout.buchung_konten_test)) {
			Button antwort1 = (Button) view.findViewById(R.id.antwort1);
[B]//NullPointerException [/B]
			antwort1.setOnClickListener(new OnClickListener() {

				@Override
				public void onClick(View v) {

					animieren(v);
				}
			});
		}


animieren-Methode
Code:
public void animieren(View view) {
		Animation animScale = AnimationUtils.loadAnimation(context,
				R.anim.button_gedrueckt);
		view.findViewById(R.id.antwort1).startAnimation(animScale);

	}


Die gesamte Klasse wie folgt:

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.text.Html;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.Button;
import android.widget.TextView;

public class SinnPageAdapter extends PagerAdapter {

	Context context;

	public SinnPageAdapter(Context context) {
		this.context = context;
	}

	// ---Die Anzahl aller Seiten zurückgeben---
	public int getCount() {
		return 5;
	}

	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.sinn;

			break;
		case 1:
			resId = R.layout.sinn1;
			break;
		case 2:
			resId = R.layout.sinn2;
			break;
		case 3:
			resId = R.layout.buchung_konten_test;
			break;

		case 4:
			resId = R.layout.test_4_button;
			break;

		}

		View view = inflater.inflate(resId, null);
		java.lang.Integer resIdInteger = resId; // in Integer umwandeln da sonst
												// kein Vergleich möglich

		if (resIdInteger.equals(R.layout.sinn)) {

			// ******************************
			// * Seite 1 *
			// ******************************

			// Inhalt befüllen
			TextView tvInhalt = (TextView) view.findViewById(R.id.sinn_inhalt);
			CharSequence inhaltText = Html
					.fromHtml("In dieser Lektion lernst Du"
							+ " die ersten Grundbegriffe und Aufgaben der Buchführung kennen. "
							+ "Die folgenden Themen schauen wir uns nun an."
							+ "<br/>" + "<br/>1. Vermögenslage"
							+ "<br/>2. Bilanz" + ""
							+ "<br/>3. Inventur / Inventar"
							+ "<br/>4. Bewertungsgrundsätze"
							+ "<br/>5. Buchführungspflicht");

			tvInhalt.setText(inhaltText);
		}

		// ******************************
		// * Seite 2 *
		// ******************************

		else if (resIdInteger.equals(R.layout.sinn1)) {
			// Titel befüllen
			TextView tv1Titel = (TextView) view.findViewById(R.id.sinn1_titel);
			CharSequence titel1Text = Html.fromHtml("1.Vermögenslage");
			tv1Titel.setText(titel1Text);

			// Inhalt befüllen
			TextView tv1Inhalt = (TextView) view
					.findViewById(R.id.sinn1_inhalt);

			CharSequence inhalt1Text = Html
					.fromHtml("Die Buchführung verschafft dem Unternehmer, "
							+ "dem Finanzamt und fremden Dritten "
							+ "einen  Überblick über die Vermögensverhältnisse des "
							+ "Unternehmens. " + "<br/><br/>");

			/*
			 * //ImageView mit Pfeil befüllen und eine Kurzmitteilung zuweisen
			 * ImageView ueberblick = (ImageView)
			 * view.findViewById(R.id.vermoegen);
			 * ueberblick.setOnClickListener(new OnClickListener() {
			 * 
			 * @Override public void onClick(View v) { Toast toast =
			 * Toast.makeText(v.getContext(), "Überblick", Toast.LENGTH_SHORT);
			 * toast.show(); } });
			 */

			tv1Inhalt.setText(inhalt1Text);
		}

		// ******************************
		// * Seite 3 *
		// ******************************

		else if (resIdInteger.equals(R.layout.sinn2)) {

			// Titel befüllen
			TextView tv2Titel = (TextView) view.findViewById(R.id.sinn2_titel);
			// CharSequence titel2Text = Html.fromHtml("1.Überblick");
			tv2Titel.setText("");

			// Inhalt befüllen
			TextView tv2Inhalt = (TextView) view
					.findViewById(R.id.sinn2_inhalt);

			CharSequence inhalt2Text = Html
					.fromHtml("Mit Hilfe der Bilanz und Buchführung "
							+ "wird der Gewinn oder Verlust des Unternehmens ermittelt.");

			tv2Inhalt.setText(inhalt2Text);
			/*
			 * CharSequence inhalt2Text = Html
			 * .fromHtml("Bei der Erstellung der Bilanz müssen jedoch einige " +
			 * "Regeln beachtet werden. Die Grundlagen dafür" +
			 * "findet man im Handelsgesetzbuch (HGB)." + "<br/>" +
			 * "Das HGB ist in 5 Bücher unterteilt, die sich mit " +
			 * "kaufmännischen Themen beschäftigen. Für uns ist " +
			 * "das 3. Buch relevant Dieses beschäftigt sich mit " +
			 * "den Handelsbüchern, also mit den Grundsätzen der " +
			 * "Bilanz und Buchführung.");
			 * 
			 * tv2Inhalt.setText(inhalt2Text);
			 */
		}

		// ******************************
		// * Seite 4 *
		// ******************************

		else if (resIdInteger.equals(R.layout.sinn3)) {
			// Titel befüllen
			TextView tv2Titel = (TextView) view.findViewById(R.id.sinn2_titel);
			CharSequence titel2Text = Html.fromHtml("1.Überblick");
			tv2Titel.setText(titel2Text);

			// Inhalt befüllen
			TextView tv2Inhalt = (TextView) view
					.findViewById(R.id.sinn2_inhalt);

			CharSequence inhalt2Text = Html
					.fromHtml("Bei der Erstellung der Bilanz müssen jedoch einige "
							+ "Regeln beachtet werden. Die Grundlagen dafür"
							+ "findet man im Handelsgesetzbuch (HGB)."
							+ "<br/>"
							+ "Das HGB ist in 5 Bücher unterteilt, die sich mit "
							+ "kaufmännischen Themen beschäftigen. Für uns ist "
							+ "das 3. Buch relevant Dieses beschäftigt sich mit "
							+ "den Handelsbüchern, also mit den Grundsätzen der "
							+ "Bilanz und Buchführung.");

			tv2Inhalt.setText(inhalt2Text);

		}

		// Seite mit GridView befüllen
		else if (resIdInteger.equals(R.layout.test_4_button)) {

		}

		else if (resIdInteger.equals(R.layout.buchung_konten_test)) {
			Button antwort1 = (Button) view.findViewById(R.id.antwort1);

			antwort1.setOnClickListener(new OnClickListener() {

				@Override
				public void onClick(View v) {

					animieren(v);
				}
			});
		}

		((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;
	}

	public void animieren(View view) {
		Animation animScale = AnimationUtils.loadAnimation(context,
				R.anim.button_gedrueckt);
		view.findViewById(R.id.antwort1).startAnimation(animScale);

	}

}
 
Ich bin mir gerade nicht sicher, ob das Fragment schon eine Activity angebunden hat zum zeitpunkt wo onCreateView aufgerufen wird.

Evtl. ist
this.getActivity()
Da schon null.
Würde ich im debugger mal gucken.

In Welcher Zeile genau bekommst du denn den NullPointer?
Ansonsten gibt es ein angepinnten Thread zum Thema NullPointer Exception vllt guckst du da mal rein
 
  • Danke
Reaktionen: Manuel1805
Hallo amfa,

ich wollte mich noch mal bei Dir für die Geduld und die Erklärungen bedanken.
Der Code funktioniert auch einwandfrei. :thumbsup:
...Manchmal sollte man erst mal lesen..der Fehler lag nun in einem anderen Codezeile.
 

Ähnliche Themen

A
  • AnimaAngelo85
Antworten
1
Aufrufe
337
swa00
swa00
MES
Antworten
10
Aufrufe
819
MES
MES
C
Antworten
8
Aufrufe
1.127
swa00
swa00
Zurück
Oben Unten