1. Nimm jetzt an unserem 2. ADVENT-Gewinnspiel teil - Alle Informationen findest Du hier!

Werte mit Intent aus "neu gestarteter" Activity übergeben

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von ZegativeNero, 02.03.2012.

  1. ZegativeNero, 02.03.2012 #1
    ZegativeNero

    ZegativeNero Threadstarter Neuer Benutzer

    Beiträge:
    8
    Erhaltene Danke:
    0
    Registriert seit:
    02.03.2012
    Hallo Forum!

    Ich verzweifle hier gerade seit Stunden an folgendem Problem:

    Ich habe eine Haupt-Activity (Texteditor) und eine Neben-Activity (Filebrowser über TableLayout) welche über das Intent-Verfahren "lustig" miteinander komunizieren. D.h.:

    1. Die Haup-Activity ruft die Neben-Activity auf und übergibt Ihr den zu öffnenden Pfad.

    2. Die Neben-Activity übergibt beim Klick auf eine Datei, den Absoluten Pfad zurück an die Haupt-Activity, welche die Datei einliest und in einem EditText darstellt.

    Soweit funktioniert das auch erstmal.

    Nun ist es aber so, dass die Neben-Activity durch sich selbst neugestartet (ebenfalls durchs "intent-Verfahren") werden muss um, falls ein Ordner angewählt wird, das TabellenLayout neu zu erstellen und zu füllen. Und genau ab diesem Punkt werden an die Hauptactivity keine Werte mehr übergeben...

    Kann mir jemand sagen warum das so ist ?

    Haupt-Activity:
    Code:
    //...
    //Aufruf des Filebrowsers:
    
                     String currentdir = basedir.toString();                
                     Intent i = new Intent(TextEditorActivity.this, Advanced_Filebrowser.class);
                     i.putExtra("currentdir", currentdir);
                     startActivityForResult(i, 0);
    
    //...
    
    //Rückgabewert abfragen:
    
                public void onActivityResult(int requestCode,int resultCode,Intent data) {
                    
                    super.onActivityResult(requestCode, resultCode, data);
                
                if (resultCode == 1) {
    
                String returnKey = data.getStringExtra("returnKey1");
    
    //...
    
    
    
    NebenActivity:
    Code:
    //...
    //Wert an Hauptactivity zurückgeben:
    
                            Intent intent = new Intent();
                            intent.putExtra("returnKey1", files_array.get(o));
                            setResult(1, intent);
                            finish();
    
    //...
    //Nebenactivity mit neuem Pfad neustarten:
    
                            String currentdir = files_array.get(o);
                            Intent intent = new Intent(this, Advanced_Filebrowser.class);
                            intent.putExtra("currentdir", currentdir);
                            startActivityForResult(intent, REQUEST_CODE);
    
                            finish();
    
    //...
    
    

    Vielen Dank für die Hilfe!!!
     
    Zuletzt bearbeitet: 02.03.2012
  2. Fonsi, 02.03.2012 #2
    Fonsi

    Fonsi Erfahrener Benutzer

    Beiträge:
    178
    Erhaltene Danke:
    15
    Registriert seit:
    08.07.2011
    Warum startest du dafür die komplette Activity neu? Lass doch einfach das bestehende TableLayout aktualisieren :blink:
     
  3. sixi, 02.03.2012 #3
    sixi

    sixi Erfahrener Benutzer

    Beiträge:
    237
    Erhaltene Danke:
    64
    Registriert seit:
    20.01.2009
    da hat der Fonsi recht :) Funktionieren tut es nicht, weil du ja nach deinem Code mit den Activity-Results arbeitest. Dieser gibt jeweils an die Activity die Aufgerufen hat das Ergebnis zurück, sprich wenn du eine "Kette" mit der gleichen Activity hast musst du das Ergebnis immer wieder durchreichen -> hässlich! :)
    Also... direkt die Daten in deiner Tabelle aktualisieren :)
     
  4. ZegativeNero, 02.03.2012 #4
    ZegativeNero

    ZegativeNero Threadstarter Neuer Benutzer

    Beiträge:
    8
    Erhaltene Danke:
    0
    Registriert seit:
    02.03.2012
    Erseinmal ein großes Dankeschön für Eure Tips! Die Idee, das TabelleLayout zu aktualisieren wollte ich so auch schon umsetzen, nur leider brachte das bisher keinen Erfolg :crying:
    Das Problem hierbei ist denke ich, dass das komplette Layout im Code erzeugt wird, und ich als Java Anfänger wohl zusätzlich auch noch auf dem Schlauch stehe...

    Hier mal die Komplette Activity mit dem Versuch das Layout zu aktualisieren:
    (P.S. Bitte haut mich nicht, wenn da ein paar Irre Hacks drin sind...)

    Code:
    package de.simple.html.editor;
    
    import java.io.File;
    import java.util.ArrayList;
    import java.util.Arrays;
    import android.app.Activity;
    import android.app.Dialog;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.Gravity;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.view.View.OnLongClickListener;
    import android.view.ViewGroup.LayoutParams;
    import android.view.Window;
    import android.widget.Button;
    import android.widget.ImageView;
    import android.widget.LinearLayout;
    import android.widget.TableLayout;
    import android.widget.TableRow;
    import android.widget.TextView;
    
    public class Advanced_Filebrowser extends Activity implements OnClickListener, OnLongClickListener {
    
            public void onBackPressed() {
    
                    finish();
    
        }
    
        public File currentdir;
        public ArrayList<String> files_array = new ArrayList<String>();
        public ArrayList<String> filename_array = new ArrayList<String>();
        public ArrayList<Boolean> checkfiles_array = new ArrayList<Boolean>();
        public Boolean t;
        public int cells;
        int o = 0;
    
        @Override
        public void onCreate(Bundle icicle) {
            super.onCreate(icicle);
    
            requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
            setContentView(R.layout.advanced_filebrowser);
            getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.customtitle);
    
            Bundle extras = getIntent().getExtras();
            String currentdir_bundle = extras.getString("currentdir");
            currentdir = new File (currentdir_bundle);
    
            listDir(currentdir);
    
            TextView thispath =  (TextView) findViewById(R.id.path);
            thispath.setText(currentdir.getAbsolutePath());
    
            buildTable();
    
        }
    
        public void buildTable(){
    
                TableLayout table = (TableLayout)findViewById(R.id.tagtable);
    
                TableRow Trow;
                TextView textView;
    
                cells=files_array.size();
    
                int k = (cells/3);           
    
                if(cells%3 >0){ k = k+1; }           
    
                for (Integer i = 0; i < k; i++) {
                    Trow = new TableRow(getApplicationContext());
                    
                    for (Integer j = 0; j < 3; j++) {
    
                            o++;
    
                            if (o<=cells){
    
                            t = checkfiles_array.get(o-1);   
    
    //Hier ist irgendwo auch noch ein kleiner Bug, da er nämlich, wenn nur eine Datei im Ordner vorhanden ist, diese nicht anzeigt ... Ab 2 aufwärts funktionierts....                                           
    
                            if ( t == true){
    
                                LinearLayout cell = new LinearLayout(this);
                                cell.setOrientation(LinearLayout.VERTICAL);
                                cell.setId(o-1);
                                cell.setClickable(true);
                                cell.setOnClickListener(this);
                                cell.setOnLongClickListener(this);
    
                                if(filename_array.get(o-1).endsWith(".html")){
    
                                ImageView pImg1 = new ImageView(Advanced_Filebrowser.this);
                                pImg1.setImageResource(R.drawable.html_file_icon);
                                cell.addView(pImg1);
    
                                }
    
                                else if(filename_array.get(o-1).endsWith(".htm")){
    
                                ImageView pImg1 = new ImageView(Advanced_Filebrowser.this);
                                pImg1.setImageResource(R.drawable.htm_file_icon);
                                cell.addView(pImg1);
    
                                }
    
                                else if(filename_array.get(o-1).endsWith(".xml")){
    
                                ImageView pImg1 = new ImageView(Advanced_Filebrowser.this);
                                pImg1.setImageResource(R.drawable.xml_file_icon);
                                cell.addView(pImg1);
    
                                }
    
                                else if(filename_array.get(o-1).endsWith(".txt")){
    
                                ImageView pImg1 = new ImageView(Advanced_Filebrowser.this);
                                pImg1.setImageResource(R.drawable.txt_file_icon);
                                cell.addView(pImg1);
    
                                }
    
                                else if(filename_array.get(o-1).endsWith(".css")){
    
                                ImageView pImg1 = new ImageView(Advanced_Filebrowser.this);
                                pImg1.setImageResource(R.drawable.css_file_icon);
                                cell.addView(pImg1);
    
                                }
                                
                                else if(filename_array.get(o-1).endsWith(".jpg") || filename_array.get(o-1).endsWith(".jpeg") || filename_array.get(o-1).endsWith(".png") || filename_array.get(o-1).endsWith(".bmp") || filename_array.get(o-1).endsWith(".gif")){
    
                                ImageView pImg1 = new ImageView(Advanced_Filebrowser.this);
                                pImg1.setImageResource(R.drawable.img_file_icon);
                                cell.addView(pImg1);
    
                                }
                                
                                else {
                                    
                                ImageView pImg1 = new ImageView(Advanced_Filebrowser.this);
                                pImg1.setImageResource(R.drawable.file_icon);
                                cell.addView(pImg1);    
                                    
                                }
    
                            String shortname = filename_array.get(o-1).substring(0,filename_array.get(o-1).lastIndexOf("."));
    
                            textView = new TextView(getApplicationContext());
                            textView.setText(shortname);
                            textView.setTextColor(R.color.desctextcolor);
                            textView.setTextSize(10);
                            LinearLayout.LayoutParams para=new LinearLayout.LayoutParams(
                            LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT );
                            para.setMargins(0, 0, 0, 10);
                            para.gravity = Gravity.CENTER_HORIZONTAL;
                            textView.setLayoutParams(para);
                            cell.addView(textView);
                            Trow.addView(cell);
    
                                }
    
                            else if (t == false){
    
                            LinearLayout cell = new LinearLayout(this);
                            cell.setOrientation(LinearLayout.VERTICAL);
                            cell.setId(o-1+1000000);
                            cell.setClickable(true);
                            cell.setOnClickListener(this);
                            cell.setOnLongClickListener(this);
                            ImageView pImg2 = new ImageView(Advanced_Filebrowser.this);
                            pImg2.setImageResource(R.drawable.directory_icon);
                            cell.addView(pImg2);
                            textView = new TextView(getApplicationContext());
                            textView.setText(filename_array.get(o-1));
                            textView.setTextColor(R.color.desctextcolor);
                            textView.setTextSize(10);
                            LinearLayout.LayoutParams para=new LinearLayout.LayoutParams(
                            LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT );
                            para.setMargins(0, 2, 0, 10);
                            para.gravity = Gravity.CENTER_HORIZONTAL;
                            textView.setLayoutParams(para);
                            cell.addView(textView);
                            Trow.addView(cell);
    
                                }
    
                            }
    
                    }
    
                    table.addView(Trow);
    
                }
    
        }
    
            public void listDir(File dir) {
    
            files_array = new ArrayList<String>();
            filename_array = new ArrayList<String>();
            checkfiles_array = new ArrayList<Boolean>();
    
            File[] files = dir.listFiles();
            Arrays.sort(files);
    
            if (files != null) {
                    for (int k = 0; k < files.length; k++) {
    
                            files_array.add(files[k].toString());
                            filename_array.add(files[k].getName().toString());
    
                            if (files[k].isDirectory()) {
    
                                    checkfiles_array.add(false);
    
                                    }
                            else {
                                
                                    checkfiles_array.add(true);
    
                            }
    
                    }
    
            }
    
    }
    
            public void onClick(View v) {
    
                    listDir(currentdir);
    
                    int o = v.getId();
    
                    if (o < 1000000){
    
                            Intent intent = new Intent();
                            intent.putExtra("returnKey1", files_array.get(o));
                            setResult(1, intent);
                            finish();
    
                    }
    
                    if (o >= 1000000){
    
                            o=o-1000000;
    
                            File newdir = new File(files_array.get(o));
                                                                      
                            listDir(newdir);
    
                            TextView thispath =  (TextView) findViewById(R.id.path);
                            thispath.setText(newdir.getAbsolutePath());
    
                            buildTable();
    
                    }
    
            }
    
            public boolean onLongClick(View v)
            {
                    listDir(currentdir);
    
                    final File currentdir2 = (currentdir);
    
                    final int c = v.getId();
    
                    if (c < 1000000){
    
                        final Dialog filedialog = new Dialog(this, R.style.CustomDialog);
                        filedialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
                        filedialog.setContentView(R.layout.filedialog_layout);
    
                        Button delbutton = (Button)filedialog.findViewById(R.id.btndelete);
                        delbutton.setOnClickListener(new OnClickListener() {
                            public void onClick(View v) {
    
                                 File delfile = new File(currentdir, filename_array.get(c));
    
                                 delfile.delete();
    
                                 files_array.clear();
                                 filename_array.clear();
                                 checkfiles_array.clear();
    
                                 String currentdir = currentdir2.toString();
                                 Intent fbnew = new Intent(getBaseContext(), Advanced_Filebrowser.class);
                                 fbnew.putExtra("currentdir", currentdir);
                                 finish();
                                 startActivity(fbnew);                             
    
                    }});
    
                        Button backbutton = (Button)filedialog.findViewById(R.id.btnback);
                        backbutton.setOnClickListener(new OnClickListener() {
                            public void onClick(View v) {
    
                                    filedialog.cancel();
    
                    }});
    
                        filedialog.show();
    
                    }
    
                    if (c >= 1000000){
    
                    final int w = c-1000000;
    
                        final Dialog filedialog = new Dialog(this, R.style.CustomDialog);
                        filedialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
                        filedialog.setContentView(R.layout.filedialog_layout);
    
                        Button delbutton = (Button)filedialog.findViewById(R.id.btndelete);
                        delbutton.setOnClickListener(new OnClickListener() {
                            public void onClick(View v) {
    
                                    File delfile = new File(currentdir, filename_array.get(w));
    
                                    delfile.delete();
    
                                    files_array.clear();
                                    filename_array.clear();
                                    checkfiles_array.clear();
    
                                 String currentdir = currentdir2.toString();
                                 Intent fbnew = new Intent(getBaseContext(), Advanced_Filebrowser.class);
                                 fbnew.putExtra("currentdir", currentdir);
                                 startActivity(fbnew);
                                 finish();
    
                    }});
    
                        Button backbutton = (Button)filedialog.findViewById(R.id.btnback);
                        backbutton.setOnClickListener(new OnClickListener() {
                            public void onClick(View v) {
    
                                    filedialog.cancel();
    
                    }});
    
                        filedialog.show();
    
                    }
    
                    return true;
    
            }
    
    }
    
     
  5. ZegativeNero, 02.03.2012 #5
    ZegativeNero

    ZegativeNero Threadstarter Neuer Benutzer

    Beiträge:
    8
    Erhaltene Danke:
    0
    Registriert seit:
    02.03.2012
    Ha !! Soweit gelöst erstmal ... das Problem war, dass ich die Variablen zu früh deklariert hatte, so dass diese in der build Table Funktion schon mit irgendwelchem Müll belegt waren... tztztz D.h. ich habe diese einfach in die build-table verschoben und dort die Tabelle mit .removeAllViews() geleert. Das einizigste Problem was hier jetzt noch besteht, ist, dass er, wenn nur eine Datei im Ordner ist, diese nicht anzeigt... ab 1+n Dateien funktionierts ?!?

    Wenn ich das jetzt auf die Dreckige Art lösen wollen würde, würde ich ja jeweils ne versteckte Datei in den Ordner legen ... :laugh:

    Danke Euch nochmal!
     
  6. mradlmaier, 03.03.2012 #6
    mradlmaier

    mradlmaier Gewerbliches Mitglied

    Beiträge:
    158
    Erhaltene Danke:
    17
    Registriert seit:
    28.10.2011
    Auf die dreckige Art und Weise.... es macht schon Sinn heraus zu finden wo der logische Fehler liegt, du wirst dadurch zu einem besseren Programmierer. Im übrigen mag die dreckige Art und Weise jetzt funktionieren, aber Du hast keine Garantie, dass der Hack bei einer späteren Erweiterung der App auch noch funktioniert.
    1+n riecht definitiv nach einem logischen Fehler in deiner App. Irgendwo missverstehst Du korrekt zu indizieren, oder loopen o.ä. Das lässt sich sicher mit etwas Suche beheben.
     
  7. ZegativeNero, 03.03.2012 #7
    ZegativeNero

    ZegativeNero Threadstarter Neuer Benutzer

    Beiträge:
    8
    Erhaltene Danke:
    0
    Registriert seit:
    02.03.2012
    Hab das Problem gelöst bekommen (siehe anderer Post)... Es lag am TableLayout in der xml Datei, da hatte ich die Zellen gestretcht, und daraufhin wurde bei nur einem File im Ordner der Inhalt aus der Tabelle rausgeschoben.
    Über Intents läuft das ganze jetzt auch nicht mehr, sondern das TableLayout wird beim Ordnerwechsel einfach neu geschrieben :)
    Mit dem 1+n wollte ich nur andeuten, dass bei mehr als einer Datei alles klappte, d.h. im Code hatte ich kein 1+n stehen...
    Der File-Browser funktioniert inzwischen wie er soll und sieht fast schon wie der ES-FileBrowser aus *juhu*

    P.S. so dreckig ist der Code jetzt auch nicht mehr ;-)
     

Diese Seite empfehlen