Autore Topic: Dialog file chooser  (Letto 3359 volte)

Offline IacopoDeeNosee

  • Utente junior
  • **
  • Post: 128
  • Respect: +33
    • Google+
    • iacopodeenosee
    • Mostra profilo
    • visualhunter
  • Dispositivo Android:
    Samsung Nexus S - GT-I9023
  • Play Store ID:
    IacopoDeeNosee
  • Sistema operativo:
    Arch linux x86_64
Dialog file chooser
« il: 20 Aprile 2011, 10:36:32 CEST »
+1
visto l'incredibile mancanza nelle api di android di un file chooser me ne sono creato uno su misura,nella rete ho trovato diverse soluzioni che fanno uso di activity ma ho preferito implementarlo dentro un dialog(più per esercizio che altro).Il codice non è lo stato dell'arte ma funziona,come sempre se avete suggerimenti e correzioni fatevi sentire;ecco il codice:
Codice (Java): [Seleziona]
public class ....... extends Activity {

        static final int DIALOG_OPENFILE_ID = 0;

        ........
        showDialog(DIALOG_OPENFILE_ID);
        ........

        @Override
        protected Dialog onCreateDialog(int id) {
                switch (id) {
                case DIALOG_OPENFILE_ID:
                        LayoutInflater li = LayoutInflater.from(this);
                        View dialogFileInputView = li.inflate(R.layout.dialog_open, null);

                        AlertDialog.Builder dialogFileInputBuilder = new AlertDialog.Builder(
                                        this);
                        dialogFileInputBuilder.setTitle("Select a file");
                        dialogFileInputBuilder.setView(dialogFileInputView);
                        AlertDialog dialogFileInput = dialogFileInputBuilder.create();

                        return dialogFileInput;
                default:
                        break;
                }
                return null;
        }

        @Override
        protected void onPrepareDialog(int id, Dialog dialog) {
                switch (id) {
                case DIALOG_OPENFILE_ID:
                        final String strRoot = "/";
                        final StringBuffer currentDir = new StringBuffer(strRoot);

                        final ArrayList<String> arrayItem = new ArrayList<String>();
                        final ArrayList<String> arrayPath = new ArrayList<String>();

                        final AlertDialog dialogFileInput = (AlertDialog) dialog;
                        final TextView textviewPathCurrent = (TextView) dialogFileInput
                                        .findViewById(R.id.dialogopenfile_tv_path);

                        textviewPathCurrent.setText(strRoot);
                        textviewPathCurrent.setTextColor(Color.RED);

                        final ListView listviewT = (ListView) dialogFileInput
                                        .findViewById(R.id.dialogopenfile_lv_itemlist);

                        refreshDir(strRoot, listviewT, arrayPath, arrayItem, this);

                        listviewT.setTextFilterEnabled(true);

                        listviewT.setOnItemClickListener(new OnItemClickListener() {
                                @Override
                                public void onItemClick(AdapterView<?> arg0, final View arg1,
                                                int position, long arg3) {

                                        final File file = new File(arrayPath.get(position));

                                        if (file.isDirectory()) {
                                                if (file.canRead()) {
                                                        textviewPathCurrent.setText(file.getPath());

                                                        currentDir.insert(0, arrayPath.get(position));
                                                        currentDir.setLength(arrayPath.get(position)
                                                                        .length());

                                                        refreshDir(arrayPath.get(position), listviewT,
                                                                        arrayPath, arrayItem, arg1.getContext());
                                                } else {
                                                        // can't access the directory
                                                        Toast.makeText(arg1.getContext(),
                                                                        "You can not get into this folder!",
                                                                        Toast.LENGTH_LONG).show();

                                                }
                                        } else {
                                                AlertDialog.Builder ConfirmDialog = new AlertDialog.Builder(
                                                                arg1.getContext());
                                                ConfirmDialog
                                                                .setMessage(
                                                                                "Are you sure you want this file ["
                                                                                                + file.getName() + "] ?")
                                                                .setCancelable(false)
                                                                .setPositiveButton("Yes",
                                                                                new DialogInterface.OnClickListener() {
                                                                                        public void onClick(
                                                                                                        DialogInterface dialog,
                                                                                                        int id) {
                                                                                                // return the selected file's
                                                                                                // path

                                                                                                Toast.makeText(
                                                                                                                arg1.getContext(),
                                                                                                                "You choose this: "
                                                                                                                                + file.getPath(),
                                                                                                                Toast.LENGTH_LONG)
                                                                                                                .show();

                                                                                                dialog.dismiss();

                                                                                                dialogFileInput.dismiss();
                                                                                        }
                                                                                })
                                                                .setNegativeButton("No",
                                                                                new DialogInterface.OnClickListener() {
                                                                                        public void onClick(
                                                                                                        DialogInterface dialog,
                                                                                                        int id) {
                                                                                                dialog.cancel();
                                                                                        }
                                                                                });
                                                AlertDialog alert = ConfirmDialog.create();
                                                alert.show();
                                        }
                                }
                        });

                        Button button = (Button) dialogFileInput
                                        .findViewById(R.id.dialogopenfile_btn_upfolder);
                        button.setOnClickListener(new View.OnClickListener() {
                                public void onClick(View v) {
                                        File file = new File(currentDir.toString());

                                        if (file.getName().equals(strRoot) == false) {

                                                refreshDir(file.getParent(), listviewT, arrayPath,
                                                                arrayItem, v.getContext());

                                                if (file.getParent().equals(strRoot) == false) {
                                                        currentDir.insert(0, file.getParent());
                                                        currentDir.setLength(file.getParent().length());
                                                }

                                                textviewPathCurrent.setText(file.getParent());
                                        }

                                }
                        });

                        break;
                default:
                        break;
                }
        }

        private void refreshDir(String strT, ListView listviewT,
                        ArrayList<String> arrayPathT, ArrayList<String> arrayItemT,
                        Context contextT) {
                arrayItemT.clear();
                arrayPathT.clear();

                // fill array adapter
                File f = new File(strT);
                File[] files = f.listFiles();

                for (int i = 0; i < files.length; i++) {
                        File file = files[i];
                        arrayPathT.add(file.getPath());
                        if (file.isDirectory())
                                arrayItemT.add(file.getName() + "/");
                        else
                                arrayItemT.add(file.getName());
                }

                // fill the list view
                listviewT.setAdapter(new ArrayAdapter<String>(contextT, R.layout.row,
                                arrayItemT));

        }
}
dialog_open.xml:
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/layout_root"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:minWidth="300dp"
        android:minHeight="400dp"
        android:padding="10dp"
        android:orientation="vertical"
>
        <LinearLayout
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:id="@+id/dialogopenfile_ll_header"
        >
                <Button
                        android:layout_width="wrap_content"
                        android:text="UP"
                        android:layout_height="wrap_content"
                        android:id="@+id/dialogopenfile_btn_upfolder"
                ></Button>
                <TextView
                        android:text="TextView"
                        android:layout_width="fill_parent"
                        android:id="@+id/dialogopenfile_tv_path"
                        android:layout_height="wrap_content"
                        android:paddingLeft="5dp"
                ></TextView>
        </LinearLayout>
        <ListView
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:id="@+id/dialogopenfile_lv_itemlist"
                android:cacheColorHint="#00000000"
        ></ListView>
</LinearLayout>
row.xml:
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<TextView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@android:id/text1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceSmall"
        android:gravity="center_vertical"
        android:paddingLeft="6dip"
        android:minHeight="?android:attr/listPreferredItemHeight" />

doc: Creating Dialogs | Android Developers

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Dialog file chooser
« Risposta #1 il: 20 Aprile 2011, 15:01:37 CEST »
0
io avevo fatto un "file manager" che potrebbe tornarti utile per espandere il tuo progetto... se ho un attimo di tempo estrapolo le classi che ti possono servire e te le posto!
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline IacopoDeeNosee

  • Utente junior
  • **
  • Post: 128
  • Respect: +33
    • Google+
    • iacopodeenosee
    • Mostra profilo
    • visualhunter
  • Dispositivo Android:
    Samsung Nexus S - GT-I9023
  • Play Store ID:
    IacopoDeeNosee
  • Sistema operativo:
    Arch linux x86_64
Re:Dialog file chooser
« Risposta #2 il: 20 Aprile 2011, 23:07:16 CEST »
0
ciao,mi serviva solo un dialog per far selezionare il file da importare dentro l'app,comunque mi piacerebbe confrontarmi con parte del tuo codice per vedere altre soluzioni ;) 8y3