Ich mache eine Anwendung für Android und etwas, was ich brauche, ist, dass eine Liste aller Dateien und Verzeichnisse auf der SD-Karte angezeigt wird und dass es in der Lage sein muss, sich durch die verschiedenen Verzeichnisse zu bewegen. Ich habe ein gutes Tutorial in anddev gefunden. Ich habe ein paar Dinge geändert, so dass sich die Anwendung auf der SD-Karte und nicht in Android-Stammverzeichnissen bewegt. Der Rest ist jedoch größtenteils derselbe.
Dies ist meine XML-Datei für die Aktivität:
<?xml version="1.0" encoding="utf-8"?>
<ListView xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@id/Android:list"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent">
<TextView
Android:layout_width="fill_parent"
Android:layout_height="wrap_content" />
</ListView>
Und das ist der Code für die Aktivität:
import hackreatorz.cifrador.R;
import Java.io.File;
import Java.util.ArrayList;
import Android.app.ListActivity;
import Android.content.res.Configuration;
import Android.os.Bundle;
import Android.view.View;
import Android.widget.ArrayAdapter;
import Android.widget.ListView;
import Android.widget.Toast;
public class ArchivosSD extends ListActivity {
private ArrayList<String> directoryEntries = new ArrayList<String>();
private File currentDirectory = new File("/sdcard/");
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
browseToSD();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
}
private void browseToSD() {
browseTo(new File("/sdcard/"));
}
private void upOneLevel() {
if(this.currentDirectory.getParent() != null)
this.browseTo(this.currentDirectory.getParentFile());
}
private void browseTo(final File directory) {
if (directory.isDirectory()) {
this.currentDirectory = directory;
fill(directory.listFiles());
} else {
Toast.makeText(ArchivosSD.this, this.directoryEntries.get(this.getSelectedItemPosition()), Toast.LENGTH_SHORT).show();
}
}
private void fill(File[] files) {
this.directoryEntries.clear();
this.directoryEntries.add(getString(R.string.current_dir));
if(this.currentDirectory.getParent() != null)
this.directoryEntries.add(getString(R.string.up_one_level));
int currentPathStringLength = (int) this.currentDirectory.getAbsoluteFile().length();
for (File file : files) {
this.directoryEntries.add(file.getAbsolutePath().substring(currentPathStringLength));
}
setListAdapter(new ArrayAdapter<String>(this, R.layout.archivos_sd, this.directoryEntries));
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
int selectionRowID = (int) this.getSelectedItemPosition();
String selectedFileString = this.directoryEntries.get(selectionRowID);
if (selectedFileString.equals(".")) {
this.browseToSD();
} else if(selectedFileString.equals("..")) {
this.upOneLevel();
} else {
File clickedFile = null;
clickedFile = new File(this.currentDirectory.getAbsolutePath() + this.directoryEntries.get(selectionRowID));
if(clickedFile != null)
this.browseTo(clickedFile);
}
}
}
Ich bekomme keine Fehler in Eclipse, aber ich erhalte eine Force Close, wenn ich die Anwendung auf meinem Telefon laufe. Wenn ich Logcat anschaue, sehe ich Folgendes:
01-01 23: 30: 29.858: FEHLER/AndroidRuntime (14911): FATALE AUSNAHME: main01-01 23: 30: 29.858: FEHLER/AndroidRuntime (14911): Java.lang.UnsupportedOperationException : addView (View, LayoutParams) wird in AdapterView nicht unterstützt
Ich habe keine Ahnung, was ich tun soll, ich habe in Google nachgeschlagen und nichts gefunden, und ich habe das gleiche bei stackoverflow getan. Dies ist meine erste Anwendung in Java und für Android, also bin ich ein echter n00b und wenn die Antwort da wäre, habe ich sie nicht verstanden. Ich würde es wirklich begrüßen, wenn Sie mir erklären könnten, was ich tun sollte, um diesen Fehler zu beheben und warum.
Vielen Dank für alles im Voraus.
Wenn Sie einen ArrayAdapter erstellen, benötigt der ArrayAdapter eine Layoutressource, die nur eine TextView enthält. Ändern Sie Ihre ArrayAdapter-Erstellung mit:
setListAdapter(new ArrayAdapter<String>(this,
Android.R.layout.simple_list_item_1,
this.directoryEntries));
und sehen, ob es funktioniert.
Für andere, die dieses Problem haben und ein Layout in ArrayAdapter
s getView
aufgeblasen haben, setzen Sie den Parameter parent
auf null
, wie in view = inflater.inflate(R.layout.mylayout, null);
Sie sollten immer versuchen, ein übergeordnetes Element zu übergeben, während Sie eine Ansicht vergrößern. Andernfalls kann das Framework nicht ermitteln, welche Layoutparameter für diese aufgeblähte Ansicht verwendet werden sollen.
Der korrekte Weg zur Behandlung der Ausnahmebedingung besteht darin, false als dritten Parameter zu übergeben. Dieses Flag gibt an, ob eine Ansicht direkt zum übergebenen Container hinzugefügt werden soll oder nicht.
Im Falle eines Adapters fügt der Adapter selbst die Ansicht hinzu, nachdem Sie die Ansicht von Ihrer getview-Methode zurückgegeben haben:
view = inflater.inflate (R.layout.mylayout, Elternteil, false);
BaseAdapter sample, kommt aus nur für uns DevBytes :
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View result = convertView;
if (result == null) {
result = mInflater.inflate(R.layout.grid_item, parent, false);
}
// Try to get view cache or create a new one if needed
ViewCache viewCache = (ViewCache) result.getTag();
if (viewCache == null) {
viewCache = new ViewCache(result);
result.setTag(viewCache);
}
// Fetch item
Coupon coupon = getItem(position);
// Bind the data
viewCache.mTitleView.setText(coupon.mTitle);
viewCache.mSubtitleView.setText(coupon.mSubtitle);
viewCache.mImageView.setImageURI(coupon.mImageUri);
return result;
}
CursorAdapter sample:
@Override
public View newView(final Context context, final Cursor cursor, final ViewGroup root) {
return mInflater.inflate(R.layout.list_item_ticket, root, false);
}
Weitere Informationen zur Inflationsrate finden Sie in diesem Artikel .
Löschen Sie TextView aus ListView in Ihrer XML-Datei
mein Problem war das: Ich überschreibe getView in arrayAdapter. Als ich dann die Ansicht aufgeblasen habe, habe ich vergessen, attach to root auf false zu setzen und das hat diese Ausnahme verursacht.
so muss es gemacht werden:
convertView = LayoutInflater.from(getContext()).inflate(R.layout.market_search_product_view, parent,false);
nachdem das problem gelöst ist!