OpenFileDialog verwenden

  • Hallo,


    ich brauechte etwas Hilfe um diesen OpenFileDialog zum Laufen zu bringen: https://github.com/Sash0k/Andr…aster/OpenFileDialog.java


    Ich habe in meinem Projekt ein package erstellt und die Datei dem Package hinzugefuegt. Danach habe ich versucht einen OpenFileDialog zu erstellen. Leider gibt es dazu kein Tutorial wie ich diese Klasse einsetzen muss. Im moment mache ich folgendes in meinem Fragment:


    Java
    OpenFileDialog myFileDialog = new OpenFileDialog(getActivity().getApplicationContext());
    myFileDialog.setFilter("*.BDF");
    myFileDialog.setTitle("Oeffne Datei");
    myFileDialog.setView(RV);   // RV ist view des Fragments
    myFileDialog.create();
    myFileDialog.show();


    1.) ich bin mir nicht sicher was create() macht und ob man das selber ausfuehren muss
    2.) ich weiss dass ein onClickListener implementiert werden muss, aber nicht wie
    3.) das Program stuerzt bei myFileDialog.show() ab. Anscheinend fehlt etwas bei der initialisierung, oder irgendwas ist falsch


    Wenn jemand ein Minimalbeispiel hat oder bezueglich dieser Klasse im Internet kennt waere ich dankbar


    Gutelo

  • Ohne genaue Fehlerausgabe schwierig.


    Vermutlich setzt du mit myFileDialog.setView(rootView) das RootView des Fragmentes, das Framework vermutet dahinter ein eigenes View, die gesamte Hierarchie kommt durcheinander und es kracht.

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Aber wie oder welches View muss ich verwenden?


    ich habe auch schon ein neues View mittels View myView = new View(context) erstellt. Dann schmiert das Programm ebenfalls ab.


    Fehlermeldung mit RV als view:


    09-17 18:36:13.805: E/AndroidRuntime(23803): FATAL EXCEPTION: main
    09-17 18:36:13.805: E/AndroidRuntime(23803): Process: info.androidhive.slidingmenu, PID: 23803
    09-17 18:36:13.805: E/AndroidRuntime(23803): java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
    09-17 18:36:13.805: E/AndroidRuntime(23803): at android.view.ViewGroup.addViewInner(ViewGroup.java:3562)
    09-17 18:36:13.805: E/AndroidRuntime(23803): at android.view.ViewGroup.addView(ViewGroup.java:3415)
    09-17 18:36:13.805: E/AndroidRuntime(23803): at android.view.ViewGroup.addView(ViewGroup.java:3391)
    09-17 18:36:13.805: E/AndroidRuntime(23803): at com.android.internal.app.AlertController.setupView(AlertController.java:413)
    09-17 18:36:13.805: E/AndroidRuntime(23803): at com.android.internal.app.AlertController.installContent(AlertController.java:241)
    09-17 18:36:13.805: E/AndroidRuntime(23803): at android.app.AlertDialog.onCreate(AlertDialog.java:337)
    09-17 18:36:13.805: E/AndroidRuntime(23803): at android.app.Dialog.dispatchOnCreate(Dialog.java:361)
    09-17 18:36:13.805: E/AndroidRuntime(23803): at android.app.Dialog.show(Dialog.java:262)
    09-17 18:36:13.805: E/AndroidRuntime(23803): at android.app.AlertDialog$Builder.show(AlertDialog.java:951)
    09-17 18:36:13.805: E/AndroidRuntime(23803): at info.androidhive.slidingmenu.openfiledialog.OpenFileDialog.show(OpenFileDialog.java:115)
    09-17 18:36:13.805: E/AndroidRuntime(23803): at info.androidhive.slidingmenu.GraphFragment$1.onClick(GraphFragment.java:70)
    09-17 18:36:13.805: E/AndroidRuntime(23803): at android.view.View.performClick(View.java:4438)
    09-17 18:36:13.805: E/AndroidRuntime(23803): at android.view.View$PerformClick.run(View.java:18422)
    09-17 18:36:13.805: E/AndroidRuntime(23803): at android.os.Handler.handleCallback(Handler.java:733)
    09-17 18:36:13.805: E/AndroidRuntime(23803): at android.os.Handler.dispatchMessage(Handler.java:95)
    09-17 18:36:13.805: E/AndroidRuntime(23803): at android.os.Looper.loop(Looper.java:136)
    09-17 18:36:13.805: E/AndroidRuntime(23803): at android.app.ActivityThread.main(ActivityThread.java:5001)
    09-17 18:36:13.805: E/AndroidRuntime(23803): at java.lang.reflect.Method.invokeNative(Native Method)
    09-17 18:36:13.805: E/AndroidRuntime(23803): at java.lang.reflect.Method.invoke(Method.java:515)
    09-17 18:36:13.805: E/AndroidRuntime(23803): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
    09-17 18:36:13.805: E/AndroidRuntime(23803): at dalvik.system.NativeStart.main(Native Method)

  • Aus einem Vergleich mit AlertDialog Beispielen habe ich inzwischen herausgefunden, dass es:


    OpenFileDialog myFileDialog = new OpenFileDialog(getActivity());


    heissen muss! Dann zeigt er den Dialog auch an. Warum es einen Typ Context erwartet, aber mit getActivity funktioniert ist mir schleierhaft.


    Edit: Oh, ich kann den Dialog anzeigen lassen, ich kann Datei auswaehlen, ich kann den Ok button event abfangen, ABER : ich komme nicht an den Pfad :(

  • Zitat

    Oh, ich kann den Dialog anzeigen lassen, ich kann Datei auswaehlen, ich kann den Ok button event abfangen, ABER : ich komme nicht an den Pfad


    Du hast aber schon gesehen, das die Klasse dafür ein Interface verwendet, das du dann auch verwenden musst?

  • Danke and.dev


    ich bin blind. Habe den Code mehrere Stunden durchgeschaut aber


    public interface OpenDialogListener {
    public void OnSelectedFile(String fileName);
    }


    hab ich nicht gesehen. Wollte schon ein Feld Filename einfuegen...


    Ich habe es jetzt so umgesetzt:


    Java
    OpenDialogListener ODListener = new OpenDialogListener(){
      	public void OnSelectedFile(String fileName)
      	{
      		String myFile = fileName;
      	}
      	};


    Leider ist der String myFile ausserhalb dieser Anweisung nicht greifbar?!


    Weisst du zufaellig auch warum setFilter(".txt") nicht funktioniert? Was fuer eine Formatierung des Strings erwartet diese Methode? Nur "txt" filtert auch alles weg.


    Gutelo

  • Ich bin zu bload fuer Android ...


    Das macht es immer noch nicht:


    Java
    OpenDialogListener ODListener = new OpenDialogListener()
            		{
           		    	public void OnSelectedFile(String fileName)
           		    	{
           		    		myFile = fileName;
           		    	}
           			};
            		
           			myFileDialog.setOpenDialogListener(ODListener);
  • Zitat

    Das macht es immer noch nicht


    Ein bisschen genauer musst du das Problem dann schon beschreiben, wenn dir jemand helfen soll :)


    Immer noch dieses Problem:

    Zitat

    Leider ist der String myFile ausserhalb dieser Anweisung nicht greifbar?!


    oder mittlerweile etwas anderes?


    Meine Vermutung ist, das dir die Logik des Konstruktes noch nicht klar ist.
    Dein Listener wird den Namen nicht einfach nur speichern wollen, sondern direkt beim Eintreffen der Daten auch eine Aktion mit ihnen durchführen, etwa die Datei öffnen un in ein EditView laden (oder eine Methode aufrufen, die das implementiert).


  • Weil Activity von ContextThemeWrapper erbt, das wiederum von ContextWrapper und das wiederum von Context.
    Somit ist eine Activity auch ein Context und in diesem Fall genau der Context den du brauchst.

  • Der Formulierung nach steht also etwas anderes drin?
    Oder gar nichts? Wird der Code überhaupt ausgeführt? (Breakpoint, Log-Ausgabe)


    Wenn der Code nicht tut was du erwartest, dann musst du ihn halt mal analysieren (sollte man mit fremdem Code eh machen, wenn man ihn übernimmt)

  • Der OpenDialogListener wird anscheinend garnicht ausgefuehrt. Im R.id.tv_msg steht zunaechst "Medium Text". Dieser Eintrag wird beim click auf das File im Openfiledialog nicht geaendert. Der OpendialogListener sieht jetzt so aus:


    Java
    OpenDialogListener ODListener = new OpenDialogListener()
    {
    public void OnSelectedFile(String fileName)
    {
    myFile = fileName;
    TextView Msg = (TextView) RV.findViewById(R.id.tv_msg);
    Msg.setText(fileName);
    }
    };
    myFileDialog.setOpenDialogListener(ODListener);
  • Hier ist die ganze Sequenz fuer OpenFileDialog:



    Wieso formatiert der das hier immer so schrecklich?

  • Als erstes fällt auf, das du mit dieser Zeile
    myFileDialog.setFilter(".BDF");


    wahrscheinlich gar keine Dateien angezeigt bekommst, wenn die Klasse noch Original ist :)
    Oder hast du das "matches" gegen ein "endsWith" getauscht?


    Dir ist schon klar, das du hiermit:
    myFileDialog.setPositiveButton("Datei laden", ClickLoad);
    den Interface-Code totlegst?

  • Das habe ich natuerlich in endsWith umgeaendert :)


    Nein es ist mir nicht klar warum ich mit setPositiveButton den Interface code "totlege".
    OpenDialogListener und OnClickListener sollten doch unterschiedliche Eventhandler sein oder nicht? Oder meinst du dass der Button click wieder ein deselect des items bewirkt? In dem Fall muesste aber der Filename schon im TextView gelandet sein als ich das item ausgewaehlt habe oder nicht?


    aus dem OpenDialogListener will ich den Filenamen bekommen, mit dem OnClickListener will ich den Filenamen verarbeiten ...

  • Zitat

    Nein es ist mir nicht klar warum ich mit setPositiveButton den Interface code "totlege".


    Dann solltest du vielleicht endlich einen Blick in die Klasse werfen, die du da benutzt :P
    Der Aufruf des Interface erfolgt in deren setPositiveButton Handler, den du mit deiner Zuweisung wieder überschreibst.
    Somit wird dein ODListener niemals aufgerufen und du hast keine Möglichkeit, an den selektierten Dateinamen zu gelangen.


    Zitat

    aus dem OpenDialogListener will ich den Filenamen bekommen, mit dem OnClickListener will ich den Filenamen verarbeiten ...


    Dann wirst du entweder den OpenFile Dialog neu- bzw. umschreiben, oder den Code aus deinem OnClickListener in den ODListener verlagern müssen.

  • Also irgendwie kapier ich das immer noch nicht.


    Das Verlagern des Codes bringt nichts. Er muss doch auch so schonmal etwas im TextView anzeigen. Ich habe den Inhalt vom OnClickListener in ODListener verlegt, keinerlei aktion ...


    Oder meinst du inklusive dem gesamten


    public void onClick(DialogInterface dialog, int which)
    { ...}


    ???

  • Moment, es scheint etwas klick zu machen.


    Ich muss dem SetPositiveButton anstatt ClickLoad den ODListener uebergeben, richtig? Und dann den Code aus ClickLoad in ODListener packen...


    Edit: hmm, setPositiveButton nimmt ODListener nicht


    Edit2: Ich kann setPositiveButton ganz wegnehmen, dann erhalte ich den fileName in ODListener, nur wie kann ich den Button dann umbenennen? Muss ich wohl im resource machen

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!