Custom xml Mehrmals benutzen

  • 6 Antworten
  • Letztes Antwortdatum
M

Mens

Neues Mitglied
0
Hallo an alle,

Ich habe folgendes Problem, ich habe eine xml layout datei, die aus ein paar linearLayouts und textViews besteht, die möchte ich mehrmals nutzen können. Es sieht so aus :

capturexml.JPG


Also erstens, wenn ich es nur einmal einer Activity hinzufüge, dann funktionniert es auch, es wird schwierig sobald ich es mehrehre male hinzufügen will, dann kann ich nur auf die erste zugreifen und bearbeiten, die anderen nicht.

Hier mal ein wenig code zum besseren Verständnis :
Code:
public class FirstActivity extends Activity {
     private LayoutInflater inflater;
     private LinearLayout parent;
     private TextView tv1,tv2,tv3,tv4;
     private View view;
 
     @Override
     public void onCreate(Bundle savedInstanceState){
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_first);
          
          inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
          parent = (LinearLayout) inflater.inflate(R.layout.activity_first);
 
          getComponents();
     }
 
     private void getComponents(){
          tv1 = (TextView) findViewById(R.id.tv1);
          tv2 = (TextView) findViewById(R.id.tv2);
          tv3 = (TextView) findViewById(R.id.tv3);
          tv4 = (TextView) findViewById(R.id.tv4);
     }
 
     private void addCustom(){
          view = new View(getApplicationContext());
          view = inflater.inflate(R.layout.custom,null);
          parent.addView(view);
          setContentView(parent);
          getComponents();
     }
}

So der interessante Teil ist bei addCustom, denn da füge ich die neue View die aus der xml besteht hinzu. Was ich jetzt möchte ist, dass ich zwischen den verschiedenen Views unterscheiden kann, denn ich möchte die einzelnen TextViews aus den unterschiedlichen Views bearbeiten, aber ich weiss nicht wirklich wie ich das anstellen soll.
 
dann musst du dir einfach die views in einer liste oder vector speichern.
 
swordi schrieb:
dann musst du dir einfach die views in einer liste oder vector speichern.
Und dann mit einem Adapter anzeigen? Oder meintest du etwas anderes?
Hmmm ich muss das mal ausprobieren, danke für den vorschlag.
 
naja ich hab keine ahnung was dein code so tun soll, warum du es so tust, wie du es tust.

wenn du mehrere zeilen hast, dann nutz doch einfach einen adapter.

mit setcontentview wirst aber auch nicht mehrere hinzufügen können. da kannst immer nur eines nehmen. nimm ein parent layout und füg deine zeilen dann ein.
 
swordi schrieb:
naja ich hab keine ahnung was dein code so tun soll, warum du es so tust, wie du es tust.

wenn du mehrere zeilen hast, dann nutz doch einfach einen adapter.

mit setcontentview wirst aber auch nicht mehrere hinzufügen können. da kannst immer nur eines nehmen. nimm ein parent layout und füg deine zeilen dann ein.

ae4jsx.png


Hier zum besseren Verständnis, also ich sollte soviele dieser Views hinzufügen können wie ich möchte. Wenn ich dann auf eine dieser Views klicke, soll sich eine neue Activity(mit EditTextes) öffnen um dann den Text der einzelnen TextView bearbeiten zu können.
 
ja gut,

das ist ganz genau eine listview mit custom adapter.

in deinem code sehe ich davon nichts. ist aber die beste lösung
 
So habe mein Code neu geschrieben mit der ListView, aber es funktioniert nicht, hier der Code:
Code:
package com.example.customcode;

import java.util.ArrayList;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;

public class MainActivity extends Activity {
	private static ArrayList<CustomActivite> items;
	private ListView listView;
	private ActiviteAdapter m_adapter;
	private static CustomActivite ca;
	private static boolean isModified;
	private volatile boolean running;
	private Button btn;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		listView = (ListView) findViewById(R.id.listView);
		btn = (Button) findViewById(R.id.button1);

		items = new ArrayList<CustomActivite>();
		this.m_adapter = new ActiviteAdapter(this, R.layout.custom, items);

		isModified = false;
		running = true;

		listView.setAdapter(m_adapter);

		listView.setOnItemClickListener(new OnItemClickListener() {
			@Override
			public void onItemClick(AdapterView<?> parent, View view,
					int position, long id) {
			}
		});

		Thread thread = new Thread(new Runnable() {
			@Override
			public void run() {
				while (running) {
					if (isModified) {
						runOnUiThread(returnRes);
						isModified = false;
					}
				}
			}
		});
		thread.start();

		btn.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				Intent i = new Intent(getApplicationContext(),
						AddActivity.class);
				startActivity(i);
			}
		});
	}

	public static void addOne(String otp, String quantite, String design,
			String commentaire) {
		ca = new CustomActivite(otp, quantite, design, commentaire);
		items.add(ca);
		isModified = true;
	}

	private Runnable returnRes = new Runnable() {
		@Override
		public void run() {
			if (items != null && items.size() > 0) {
				m_adapter.notifyDataSetChanged();
				for (int i = 0; i < items.size(); i++) {
					m_adapter.add(items.get(i));
				}
			}
			m_adapter.notifyDataSetChanged();
		}
	};

	private class ActiviteAdapter extends ArrayAdapter<CustomActivite> {
		private ArrayList<CustomActivite> items;

		public ActiviteAdapter(Context context, int textViewResourceId,
				ArrayList<CustomActivite> items) {
			super(context, textViewResourceId, items);
			this.items = items;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			View v = convertView;
			if (v == null) {
				LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
				v = vi.inflate(R.layout.custom, null);
			}

			CustomActivite ca = items.get(position);

			if (ca != null) {
				TextView tOtp = (TextView) v.findViewById(R.id.tvCustomOtp);
				TextView tQuantite = (TextView) v
						.findViewById(R.id.tvCustomQuantite);
				TextView tDesign = (TextView) v
						.findViewById(R.id.tvCustomDesign);
				TextView tCommentaire = (TextView) v
						.findViewById(R.id.tvCustomComm);
				tOtp.setText(ca.getOtp());
				tQuantite.setText(ca.getQuantite());
				tDesign.setText(ca.getDesign());
				tCommentaire.setText(ca.getCommentaire());
			}
			return v;
		}
	}
}

class CustomActivite {
	private String otp;
	private String quantite;
	private String design;
	private String commentaire;

	public CustomActivite(String otp, String quantite, String design,
			String commentaire) {
		this.otp = otp;
		this.quantite = quantite;
		this.design = design;
		this.commentaire = commentaire;
	}

	public void setOtp(String otp) {
		this.otp = otp;
	}

	public void setQuantite(String quantite) {
		this.quantite = quantite;
	}

	public void setDesign(String design) {
		this.design = design;
	}

	public void setCommentaire(String commentaire) {
		this.commentaire = commentaire;
	}

	public String getOtp() {
		return otp;
	}

	public String getQuantite() {
		return quantite;
	}

	public String getDesign() {
		return design;
	}

	public String getCommentaire() {
		return commentaire;
	}
}

Ich bekomme folgende Exception:
11-14 16:13:54.785: E/AndroidRuntime(23339): FATAL EXCEPTION: main
11-14 16:13:54.785: E/AndroidRuntime(23339): java.lang.OutOfMemoryError
11-14 16:13:54.785: E/AndroidRuntime(23339): at java.util.ArrayList.add(ArrayList.java:114)
11-14 16:13:54.785: E/AndroidRuntime(23339): at android.widget.ArrayAdapter.add(ArrayAdapter.java:179)
11-14 16:13:54.785: E/AndroidRuntime(23339): at com.example.customcode.MainActivity$1.run(MainActivity.java:88)
11-14 16:13:54.785: E/AndroidRuntime(23339): at android.os.Handler.handleCallback(Handler.java:605)
11-14 16:13:54.785: E/AndroidRuntime(23339): at android.os.Handler.dispatchMessage(Handler.java:92)
11-14 16:13:54.785: E/AndroidRuntime(23339): at android.os.Looper.loop(Looper.java:137)
11-14 16:13:54.785: E/AndroidRuntime(23339): at android.app.ActivityThread.main(ActivityThread.java:4507)
11-14 16:13:54.785: E/AndroidRuntime(23339): at java.lang.reflect.Method.invokeNative(Native Method)
11-14 16:13:54.785: E/AndroidRuntime(23339): at java.lang.reflect.Method.invoke(Method.java:511)
11-14 16:13:54.785: E/AndroidRuntime(23339): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)
11-14 16:13:54.785: E/AndroidRuntime(23339): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
11-14 16:13:54.785: E/AndroidRuntime(23339): at dalvik.system.NativeStart.main(Native Method)
com.example.customcode.MainActivity$1.run(MainActivity.java:88) das ist die zeile m_adapter.add(items.get(i));
 
Zurück
Oben Unten