Daten an zweite Activity senden

  • Antworten:20
Antonio P.
  • Forum-Beiträge: 113

07.03.2014, 13:15:44 via Website

Hallo,

die 1.Activity beinhaltet eine Vielzahl an Cards (Google Now Style).
die 2.Activity besteht aus drei Tabs(also drei verschiedenen Fragments)

Beim Klick einer Card soll die 2. Activity drei Image Dateien erhalten und sie in den drei Fragmenten anzeigen (also jedes Fragment EIN Bild)

Jede Card schickt immer unterschiedliche Image Dateien.

Wie kann ich das lösen? (putExtra(), getExtra() ???)

Habe es bisher so versucht.

1// Create an intent
2 Intent intent = new Intent(this, GetActivity.class);
3 intent.putExtra("Image_url", R.drawable.ic_launcher1);
4 intent.putExtra("Image_url", R.drawable.ic_launcher2);
5 intent.putExtra("Image_url", R.drawable.ic_launcher3);
6 // Start activity
7 startActivity(intent);

Leider weis ich nicht ob das so stimmt, weil ich nicht weis, wie ich diese Bilder in der zweiten Activity bzw. in den drei Fragments erhalten/implementieren soll

Danke im Voraus
Ando

Antworten
Fabian Simon
  • Forum-Beiträge: 359

07.03.2014, 13:48:34 via Website

Du ziehst im zweiten Aktivtiy.
Dort verwaltest du ja die Fragmente.
Den entsprechenden Fragmenete weißt du eine Klasse zu über die sie geladen bzw zu der sie gehören.
Nun kannst du der entsprechenden Klasse des Fragments die Bilder zuweisen .
Boha ist das schwer zu erklären.
hoffe hast verstanden was ich meine.
Imgrunde musst du den Fragmenten nur eine Klassenstruktur hinzufügen (Wie du dem Activity das entsprechebde View zuweißt.)
dann kannst du dem object des ensprechende Fragment die Infos zuweißen

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

07.03.2014, 13:53:33 via Website

Wie sieht denn die 2. Aktivity aus, in der sich die Fragment Steuerung befindet?

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Antonio P.
  • Forum-Beiträge: 113

07.03.2014, 14:19:37 via Website

Danke für die Antworten.

Ich weis leider nicht wie ich die getExtra() implementieren soll in den einzelnen Fragmenten.
ich weiß dass in:
Fragment 1: ic_launcher1.png
Fragment 2: ic_launcher2.png
Fragment 3: ic_launcher3.png

geladen werden. Wie gesagt weiß ich nicht wie ich das implementieren soll. Ob das mit der putExtra() und getExtra() die sinnvollste Lösung ist.
Es sind über 100 cards und jede card beinhaltet 3 image dateien. Das heißt ca. 300 verschiedene image Dateien.

Können diese image dateien auch wo anders gelagert werden, so dass jede Activity darauf zugreifen kann???

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

07.03.2014, 14:21:35 via Website

Du hast es nicht Verstenden.
Du hast doch eine Fragment kontroll Acitivity (auf diese geht dein intent ) und die Muss das für die einzelenen Fragments regeln. Wie sieht von der denn der Code aus?

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Antonio P.
  • Forum-Beiträge: 113

07.03.2014, 14:27:15 via Website

Das ist der vorgeschriebene Code von Eclipse.

1public class ShowActivity extends FragmentActivity implements
2 ActionBar.TabListener {
3
4 /**
5 * The {@link android.support.v4.view.PagerAdapter} that will provide
6 * fragments for each of the sections. We use a
7 * {@link android.support.v4.app.FragmentPagerAdapter} derivative, which
8 * will keep every loaded fragment in memory. If this becomes too memory
9 * intensive, it may be best to switch to a
10 * {@link android.support.v4.app.FragmentStatePagerAdapter}.
11 */
12 SectionsPagerAdapter mSectionsPagerAdapter;
13
14 /**
15 * The {@link ViewPager} that will host the section contents.
16 */
17 ViewPager mViewPager;
18
19 @Override
20 protected void onCreate(Bundle savedInstanceState) {
21 super.onCreate(savedInstanceState);
22 setContentView(R.layout.activity_show);
23
24 // Set up the action bar.
25 final ActionBar actionBar = getActionBar();
26 actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
27
28 // Create the adapter that will return a fragment for each of the three
29 // primary sections of the app.
30 mSectionsPagerAdapter = new SectionsPagerAdapter(
31 getSupportFragmentManager());
32
33 // Set up the ViewPager with the sections adapter.
34 mViewPager = (ViewPager) findViewById(R.id.pager);
35 mViewPager.setAdapter(mSectionsPagerAdapter);
36
37 // When swiping between different sections, select the corresponding
38 // tab. We can also use ActionBar.Tab#select() to do this if we have
39 // a reference to the Tab.
40 mViewPager
41 .setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
42 @Override
43 public void onPageSelected(int position) {
44 actionBar.setSelectedNavigationItem(position);
45 }
46 });
47
48 // For each of the sections in the app, add a tab to the action bar.
49 for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) {
50 // Create a tab with text corresponding to the page title defined by
51 // the adapter. Also specify this Activity object, which implements
52 // the TabListener interface, as the callback (listener) for when
53 // this tab is selected.
54 actionBar.addTab(actionBar.newTab()
55 .setText(mSectionsPagerAdapter.getPageTitle(i))
56 .setTabListener(this));
57 }
58 }
59
60 @Override
61 public boolean onCreateOptionsMenu(Menu menu) {
62 // Inflate the menu; this adds items to the action bar if it is present.
63 getMenuInflater().inflate(R.menu.show, menu);
64 return true;
65 }
66
67 @Override
68 public void onTabSelected(ActionBar.Tab tab,
69 FragmentTransaction fragmentTransaction) {
70 // When the given tab is selected, switch to the corresponding page in
71 // the ViewPager.
72 mViewPager.setCurrentItem(tab.getPosition());
73 }
74
75 @Override
76 public void onTabUnselected(ActionBar.Tab tab,
77 FragmentTransaction fragmentTransaction) {
78 }
79
80 @Override
81 public void onTabReselected(ActionBar.Tab tab,
82 FragmentTransaction fragmentTransaction) {
83 }
84
85 /**
86 * A {@link FragmentPagerAdapter} that returns a fragment corresponding to
87 * one of the sections/tabs/pages.
88 */
89 public class SectionsPagerAdapter extends FragmentPagerAdapter {
90
91 public SectionsPagerAdapter(FragmentManager fm) {
92 super(fm);
93 }
94
95 @Override
96 public Fragment getItem(int position) {
97 // getItem is called to instantiate the fragment for the given page.
98 // Return a DummySectionFragment (defined as a static inner class
99 // below) with the page number as its lone argument.
100 Fragment fragment = new DummySectionFragment();
101 Bundle args = new Bundle();
102 args.putInt(DummySectionFragment.ARG_SECTION_NUMBER, position + 1);
103 fragment.setArguments(args);
104 return fragment;
105 }
106
107 @Override
108 public int getCount() {
109 // Show 3 total pages.
110 return 3;
111 }
112
113 @Override
114 public CharSequence getPageTitle(int position) {
115 Locale l = Locale.getDefault();
116 switch (position) {
117 case 0:
118 return getString(R.string.title_section3).toUpperCase(l);
119 case 1:
120 return getString(R.string.title_section4).toUpperCase(l);
121 case 2:
122 return getString(R.string.title_section5).toUpperCase(l);
123 }
124 return null;
125 }
126 }
127
128 /**
129 * A dummy fragment representing a section of the app, but that simply
130 * displays dummy text.
131 */
132 public static class DummySectionFragment extends Fragment {
133 /**
134 * The fragment argument representing the section number for this
135 * fragment.
136 */
137 public static final String ARG_SECTION_NUMBER = "section_number";
138
139 public DummySectionFragment() {
140 }
141
142 @Override
143 public View onCreateView(LayoutInflater inflater, ViewGroup container,
144 Bundle savedInstanceState) {
145 View rootView = inflater.inflate(R.layout.fragment_show_dummy,
146 container, false);
147 TextView dummyTextView = (TextView) rootView
148 .findViewById(R.id.section_label);
149 dummyTextView.setText(Integer.toString(getArguments().getInt(
150 ARG_SECTION_NUMBER)));
151 return rootView;
152 }
153 }
154
155}

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

07.03.2014, 14:39:02 via Website

In der OnCreate in der Show Activity kannst du dann aus den Intent die Daten holen und sie weiterverarbeiten

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Antonio P.
  • Forum-Beiträge: 113

07.03.2014, 14:43:34 via Website

Okay das war mit bisher alles klar. Nun weiß ich nicht wie ich das umsetze mit dem getIntent() und getExtras().

Antworten
Antonio P.
  • Forum-Beiträge: 113

07.03.2014, 15:15:18 via Website

Hab mal ein Beispiel Code zum testen geschrieben.
Ich habe eine "halbe Lösung" gefunden...leider entsteht EIN EINZIGER Fehler uzw in der onClick() Methode kann wird byteArray nicht erkannt!

hier der Code der MainActivity

1public class MainActivity extends Activity implements OnClickListener{
2
3 @Override
4 protected void onCreate(Bundle savedInstanceState) {
5 super.onCreate(savedInstanceState);
6 setContentView(R.layout.activity_main);
7
8 Button button1 = (Button)findViewById(R.id.button1);
9 button1.setOnClickListener(this);
10
11 Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.hsesslingen);
12 ByteArrayOutputStream stream = new ByteArrayOutputStream();
13 bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
14 byte[] byteArray = stream.toByteArray();
15
16
17 }
18
19 @Override
20 public boolean onCreateOptionsMenu(Menu menu) {
21 // Inflate the menu; this adds items to the action bar if it is present.
22 getMenuInflater().inflate(R.menu.main, menu);
23 return true;
24 }
25
26 @Override
27 public void onClick(View v) {
28 // TODO Auto-generated method stub
29 Intent intent = new Intent(this, GetActivity.class);
30 intent.putExtra("picture", byteArray);
31 startActivity(intent);
32 }
33
34}

Hier der Code der GetActivity

1public class GetActivity extends Activity {
2
3 @Override
4 protected void onCreate(Bundle savedInstanceState) {
5 super.onCreate(savedInstanceState);
6 setContentView(R.layout.activity_get);
7
8 Bundle extras = getIntent().getExtras();
9 byte[] byteArray = extras.getByteArray("picture");
10
11 Bitmap bmp = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);
12 ImageView image = (ImageView) findViewById(R.id.imageView1);
13
14 image.setImageBitmap(bmp);
15 }
16
17 @Override
18 public boolean onCreateOptionsMenu(Menu menu) {
19 // Inflate the menu; this adds items to the action bar if it is present.
20 getMenuInflater().inflate(R.menu.get, menu);
21 return true;
22 }
23
24}

— geändert am 07.03.2014, 15:15:56

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

07.03.2014, 15:20:26 via Website

Wieso machst du das über ein Bytearray. Du kannst doch einfach das Bitmap übergeben

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Antonio P.
  • Forum-Beiträge: 113

07.03.2014, 15:32:38 via Website

Fand ich ganz nachvollziehbar. Jedoch habe ich was einfacheres gefunden.
Was ist wenn meine image dateien alle in res/drawable gelagert sind. Kann ich dann durch Klicken der Cards die entsprechenden drei bilder laden?

Nun entsteht ein weiteres Problem. Die Cards sind keine einzelnen Buttons und haben alle den gleichen aufbau, sprich die id ist bei allen die selbe, kann also keine switch-case Anweisung durch R.id..... erkennen.
Die Cards wurden über ein Konstruktor geparst. Kann ich durch klicken der Cards, den String (Titel der Card) erkennen z.B mit getString und somit dann die drei bilder laden?

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

07.03.2014, 15:36:43 via Website

Wenn du das Bild doch schon als Bitmap hast, ist es doch das einfachste das zu übergeben.
Deine Erklärung mit dem Parsen im Konstriktor hab ich nicht verstanden

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Antonio P.
  • Forum-Beiträge: 113

07.03.2014, 15:40:03 via Website

Sry, aber ist meine erste APP, die ich programmiere.
So werde ich es wohl machen.

Ich habe einen Konstruktor für die CardUI. Diese sieht so aus:

1public CardModel(String titlePlay, String description, String color,
2 String titleColor, Boolean hasOverflow, Boolean isClickable,
3 Class<? extends AbstractCard> cardClass) {
4 this.titlePlay = titlePlay;
5 this.description = description;
6 this.color = color;
7 this.titleColor = titleColor;
8 this.hasOverflow = hasOverflow;
9 this.isClickable = isClickable;
10 this.cardClass = cardClass;
11 }

Das heißt, die Cards haben KEINE ID, so dass ich diese einfach in eine switch-case-Anweisung verarbeiten kann.

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

07.03.2014, 15:44:12 via Website

Aber wie sind den die Bilder gespeichert, doch in einer Bitmap Variable oder nicht?

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Antonio P.
  • Forum-Beiträge: 113

07.03.2014, 15:56:06 via Website

Wenn ich die ganze Bitmap übergebe kostet es mir zu viel Speicher. Ich möchte es mit der ID laden.

Die Bilder sind im /res/drawable gelagert.

— geändert am 07.03.2014, 15:56:38

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

07.03.2014, 15:57:17 via Website

Dann musst du in deine Card Klasse die IDs implementieren, damt du sie später wieder abfragen kannst

— geändert am 07.03.2014, 15:57:28

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Antonio P.
  • Forum-Beiträge: 113

07.03.2014, 16:08:53 via Website

Das ist eine Libraray. Ich weiß echt nicht wie ich das ändern soll. Mir ist gerade wichtiger wie ich die Bilder in die Activity lade. Ich sitze gerade echt aufm Schlauch.

Angenommen ich habe nur zwei Buttons, dann kann ich die in switch case Anweisung verarbeiten über die entsprechenden ID´s. Aber wie lade ich dann die Bilder in der zweiten Activity???

— geändert am 07.03.2014, 16:13:04

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

07.03.2014, 16:13:33 via Website

Dann brauchst du eine zusätzliche klasse, die dir die ID Arbeit übernimmt. Oder du findest einen Weg die Lib zu modifizieren

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Antonio P.
  • Forum-Beiträge: 113

07.03.2014, 16:17:12 via Website

wie sieht so eine klasse aus...das wäre echt der hammer

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

07.03.2014, 16:19:17 via Website

Da ich nicht weiß welche Funktionen der Lib und welche überhaupt du benutzt kann ich es dir nicht sagen.
Du musst dir halt eine Struktur und eine Speichermöglichkeit überlegen.
Zb. du legst eine Liste an, der dem Titel eine Bildnummer ´zuordnet

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten