<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <Button android:id="@+id/button1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Button" /> <Button android:id="@+id/button2" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Button" /> </LinearLayout> |
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="file.picker.dialog.namespace" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:name=".FilePickerDialogActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> </manifest> |
package file.picker.dialog.namespace; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class FilePickerDialogActivity extends Activity { Button button1; Button button2; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); button1 = (Button)findViewById(R.id.button1); button1.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { MyFilePickerDialogS testdialog; testdialog = new MyFilePickerDialogS(FilePickerDialogActivity.this, new MyFilePickerDialogS.OnMyFilePickerListener() { public void onDateSet(String s) { button1.setText(s); } },"/");//←1個の時は初期ディレクトリ(ここではルートを指定している) testdialog.show(); } }); button2 = (Button)findViewById(R.id.button2); button2.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { MyFilePickerDialogM testdialog; testdialog = new MyFilePickerDialogM(FilePickerDialogActivity.this, new MyFilePickerDialogM.OnMyFilePickerListener() { public void onDateSet(String s) { button2.setText(s); } },"/");//←1個の時は初期ディレクトリ(ここではルートを指定している) testdialog.show(); } }); } } |
package file.picker.dialog.namespace; /* * ファイル選択ダイアログ * 単一選択 * 呼び出し方 MyFilePickerDialogS testdialog; testdialog = new MyFilePickerDialogS(this, new MyFilePickerDialogS.OnMyFilePickerListener() { public void onDateSet(String s) { button3.setText(s); } },"/");//←1個の時は初期ディレクトリ testdialog.show(); },"/","txt");//←2個の時は初期ディレクトリと表示する拡張子 },"/","/");//←拡張子に「/」を指定した場合はディレクトリ検索モード */ import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.List; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.TextView; public class MyFilePickerDialogS extends AlertDialog implements DialogInterface { private OnMyFilePickerListener mListener; private String CurDir=""; ArrayAdapter<String> adapter; Context mycontext; String myexp="";//拡張子指定 boolean DF=false;//ディレクトリ選択フラグ public MyFilePickerDialogS(Context context, OnMyFilePickerListener Listener,String cd) { super(context); mycontext=context; mListener=Listener; CurDir=cd; Initialize(); } public MyFilePickerDialogS(Context context, OnMyFilePickerListener Listener,String cd,String exp) { super(context); mycontext=context; mListener=Listener; CurDir=cd; myexp=exp; if(myexp.equals("/")){DF=true;} Initialize(); } private void Initialize(){ LinearLayout layout=new LinearLayout(mycontext); layout.setOrientation(LinearLayout.VERTICAL); setView(layout); ListView lv= new ListView(mycontext); layout.addView(lv); adapter = new ArrayAdapter <String>(mycontext, android.R.layout.simple_list_item_1); SetAdapter(CurDir); lv.setAdapter(adapter); lv.setOnItemClickListener(new OnItemClickListener(){ @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { TextView tv=(TextView)arg1; String fn=(String) tv.getText(); if(arg2==0){//0番目=親ディレクトリ if(CurDir.length()>1){ CurDir=CurDir.substring(0,CurDir.length()-1); CurDir=CurDir.substring(0,CurDir.lastIndexOf("/"))+"/"; SetAdapter(CurDir); setTitle("["+CurDir+"]"); } } else if(fn.charAt(0)=='/'){//先頭が「/」=子ディレクトリ CurDir=CurDir+fn.substring(1)+"/"; SetAdapter(CurDir); setTitle("["+CurDir+"]"); } else{//先頭が「/」ではない=ファイル名 String ss=CurDir+fn; mListener.onDateSet(ss); dismiss(); } } }); setTitle("["+CurDir+"]"); if(DF==false){//ファイル選択モード setButton(BUTTON_POSITIVE, mycontext.getText(android.R.string.cancel), (OnClickListener) null); } else{//ディレクトリ選択モード setButton(BUTTON_POSITIVE, mycontext.getText(android.R.string.ok), new OnClickListener(){ @Override public void onClick(DialogInterface dialog, int which) { mListener.onDateSet(CurDir); dismiss(); } }); setButton(BUTTON_NEGATIVE, mycontext.getText(android.R.string.cancel), (OnClickListener) null); } } //adapterにファイル名リストを書き込む private void SetAdapter(String s){ Comparator<String> asc = new Comparator<String>() {//大文字小文字を無視してソートする public int compare(String arg0, String arg1) { return arg0.toUpperCase().compareTo(arg1.toUpperCase()); } }; File dir=new File(s); File[] file_lists=null; try{file_lists = dir.listFiles();} catch(Exception e){/*Log.d("SetAdapter",e.toString());*/} adapter.clear(); adapter.add(new String("..")); if(file_lists!=null){ List <String>file_lists2 = new ArrayList<String>(); for (File file : file_lists) { if(file.isDirectory()){ //ディレクトリの場合 file_lists2.add("/"+file.getName()); }else{ //通常のファイル if(DF==false){ if(myexp.length()==0){ file_lists2.add(file.getName()); } else{ String ea[]=myexp.split(","); int i; boolean cf=false; for(i=0;i<ea.length;i++){ String ss=".*\\."+ea[i]; if(file.getName().matches(ss)){cf=true;} } if(cf){file_lists2.add(file.getName());} } } } } String[] file_lists3 = (String[])file_lists2.toArray(new String[0]); Arrays.sort(file_lists3,asc);//ソート for (String file : file_lists3) { adapter.add(new String(file)); } } } public interface OnMyFilePickerListener { void onDateSet(String s); } } |
package file.picker.dialog.namespace; /* * ファイル選択ダイアログ * 複数選択可能バージョン * 呼び出し方 * MyFilePickerDialogM testdialog; testdialog = new MyFilePickerDialogM(this, new MyFilePickerDialogM.OnMyFilePickerListener() { public void onDateSet(String s) { Log.d("selected files",""+s);//******** } },"/");//←1個の時は初期ディレクトリ testdialog.show(); * * 表示するファイルを指定する場合 },"/","txt");//←2個の時は初期ディレクトリと表示する拡張子,拡張子は「,」で区切って複数指定可能 },"/","/");//←拡張子に「/」を指定した場合はディレクトリ検索モード */ import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.List; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.res.TypedArray; import android.graphics.drawable.Drawable; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.CheckedTextView; import android.widget.LinearLayout; import android.widget.ListView; public class MyFilePickerDialogM extends AlertDialog implements DialogInterface { private OnMyFilePickerListener mListener; private String CurDir=""; Context mycontext; String myexp="";//拡張子指定 boolean DF=false;//ディレクトリ選択フラグ ArrayAdapter<IntentItem> adapter; private class IntentItem {//データ保存用 private String title;//ファイル・ディレクトリ名 private boolean cbf;//チェックボックスを表示するかどうかのフラグ private boolean cf;//チェックボックスのチェック状態のフラグ private IntentItem(String title,boolean f,boolean ff) { this.title = title; this.cbf=f; this.cf=ff; } } private class IntentItemArrayAdapter extends ArrayAdapter<IntentItem> { private int resourceId; public IntentItemArrayAdapter(Context context, int resourceId) { super(context, resourceId); this.resourceId = resourceId; } @Override public View getView(int position, View convertView, ViewGroup parent) { final IntentItem intentItem = (IntentItem) getItem(position); if (convertView == null) { LayoutInflater inflater = (LayoutInflater) getContext() .getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = inflater.inflate(resourceId, null); } //CheckedTextView tv = (CheckedTextView) convertView.findViewById(R.id.text);//←自作のXMLを使う CheckedTextView tv = (CheckedTextView) convertView.findViewById(android.R.id.text1);//←システムのXMLを使う if(intentItem.cbf){ int[] attrs = { android.R.attr.listChoiceIndicatorMultiple }; TypedArray ta = getContext().getTheme().obtainStyledAttributes(attrs); Drawable indicator = ta.getDrawable(0); tv.setCheckMarkDrawable(indicator); ta.recycle(); } else{ tv.setCheckMarkDrawable(null); } tv.setText(intentItem.title); tv.setChecked(intentItem.cf); tv.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View arg0) { CheckedTextView ctv=(CheckedTextView)arg0; if(intentItem.cbf){//チェックボックスあり=ファイル名 ctv.setChecked(!intentItem.cf);//チェックを反転する intentItem.cf=!intentItem.cf; } else{//チェックボックスなし=ディレクトリ名 if(intentItem.title.equals("..") ){//親ディレクトリ if(CurDir.length()>1){ CurDir=CurDir.substring(0,CurDir.length()-1); CurDir=CurDir.substring(0,CurDir.lastIndexOf("/"))+"/"; SetAdapter(CurDir); setTitle("["+CurDir+"]"); } } else{//子ディレクトリ CurDir=CurDir+intentItem.title.substring(1)+"/"; SetAdapter(CurDir); setTitle("["+CurDir+"]"); } } } }); return convertView; } } public MyFilePickerDialogM(Context context, OnMyFilePickerListener Listener,String cd) { super(context); mycontext=context; mListener=Listener; CurDir=cd; Initialize(); } public MyFilePickerDialogM(Context context, OnMyFilePickerListener Listener,String cd,String exp) { super(context); mycontext=context; mListener=Listener; CurDir=cd; myexp=exp; if(myexp.equals("/")){DF=true;} Initialize(); } private void Initialize(){ LinearLayout layout=new LinearLayout(mycontext); layout.setOrientation(LinearLayout.VERTICAL); setView(layout); ListView lv= new ListView(mycontext); layout.addView(lv); //adapter = new IntentItemArrayAdapter(mycontext,R.layout.my_file_picker_row);//←自作のXMLを使う adapter = new IntentItemArrayAdapter(mycontext,android.R.layout.simple_list_item_multiple_choice);//←システムのXMLを使う SetAdapter(CurDir); lv.setAdapter(adapter); setTitle("["+CurDir+"]"); //OKボタン setButton(BUTTON_POSITIVE, mycontext.getText(android.R.string.ok), (OnClickListener) new OnClickListener(){ public void onClick(DialogInterface dialog, int which) { int no=adapter.getCount(); int i; int cnt=0; String ss=CurDir; for(i=0;i<no;i++){ IntentItem intentItem = (IntentItem) adapter.getItem(i); if(intentItem.cf){ ss=ss+"\n"+intentItem.title; cnt++; } } if(DF){mListener.onDateSet(ss);} else{ if(cnt>0){mListener.onDateSet(ss);} else{} } } }); //Cancelボタン setButton(BUTTON_NEGATIVE, mycontext.getText(android.R.string.cancel), (OnClickListener) null); } //adapterにファイル名リストを書き込む private void SetAdapter(String s){ Comparator<String> asc = new Comparator<String>() {//大文字小文字を無視してソートする public int compare(String arg0, String arg1) { return arg0.toUpperCase().compareTo(arg1.toUpperCase()); } }; File dir=new File(s); File[] file_lists=null; try{file_lists = dir.listFiles();} catch(Exception e){/*Log.d("SetAdapter",e.toString());*/} adapter.clear(); adapter.add(new IntentItem("..",false,false)); if(file_lists!=null){ List <String>file_lists2 = new ArrayList<String>(); for (File file : file_lists) { if(file.isDirectory()){ //ディレクトリの場合 file_lists2.add("/"+file.getName()); }else if(DF==false){ //通常のファイル if(myexp.length()==0){ file_lists2.add(file.getName()); } else{//拡張子指定あり String ea[]=myexp.split(","); int i; boolean cf=false; for(i=0;i<ea.length;i++){ String ss=".*\\."+ea[i]; if(file.getName().matches(ss)){cf=true;} } if(cf){file_lists2.add(file.getName());} } } } String[] file_lists3 = (String[])file_lists2.toArray(new String[0]); Arrays.sort(file_lists3,asc);//ソート for (String file : file_lists3) { if(file.charAt(0)=='/'){ adapter.add(new IntentItem(file,false,false)); } else{ adapter.add(new IntentItem(file,true,false)); } } } } public interface OnMyFilePickerListener { void onDateSet(String s); } } |
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content"> <CheckedTextView android:id="@+id/text" android:layout_width="match_parent" android:layout_height="?android:attr/listPreferredItemHeight" android:textAppearance="?android:attr/textAppearanceLarge" android:gravity="center_vertical" android:checkMark="?android:attr/listChoiceIndicatorMultiple" android:paddingLeft="6dip" android:paddingRight="6dip" /> </RelativeLayout> |
package file.picker.dialog.namespace; import android.app.Activity; import android.app.Dialog; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class FilePickerDialogActivity extends Activity { private static final int DIALOG1=1; private static final int DIALOG2=2; Button button1; Button button2; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); button1 = (Button)findViewById(R.id.button1); button1.setOnClickListener(new OnClickListener(){ @Override public void onClick(View arg0) { showDialog(DIALOG1); }}); button2 = (Button)findViewById(R.id.button2); button2.setOnClickListener(new OnClickListener(){ @Override public void onClick(View arg0) { showDialog(DIALOG2); }}); } protected Dialog onCreateDialog(int id) { Dialog dialog = null; switch(id) { case DIALOG1: dialog = new MyFilePickerDialogS(this, new MyFilePickerDialogS.OnMyFilePickerListener() { public void onDateSet(String s) { button1.setText(s); } },"/");//←1個の時は初期ディレクトリ(ここではルートを指定している) //前回開いた時の状態を引き継がせたくない場合はonDismissでremoveDialogする //dialog.setOnDismissListener(new OnDismissListener(){ // @Override // public void onDismiss(DialogInterface arg0) { // removeDialog(DIALOG1); // }}); break; case DIALOG2: dialog = new MyFilePickerDialogM(this, new MyFilePickerDialogM.OnMyFilePickerListener() { public void onDateSet(String s) { button2.setText(s); } },"/");//←1個の時は初期ディレクトリ(ここではルートを指定している) break; default: dialog = null; } return dialog; } } |
package file.picker.dialog.namespace; /* * ファイル選択ダイアログ * 2012/5/6 * 2016/4/24 文字の色を変えられるように改変 * 単一選択 * 呼び出し方 MyFilePickerDialogS2 testdialog; testdialog = new MyFilePickerDialogS2(this, new MyFilePickerDialogS2.OnMyFilePickerListener() { public void onDateSet(String s) { button3.setText(s); } },"/");//←1個の時は初期ディレクトリ testdialog.show(); },"/","txt");//←2個の時は初期ディレクトリと表示する拡張子 },"/","/");//←拡張子に「/」を指定した場合はディレクトリ検索モード */ import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.TextView; import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.List; public class MyFilePickerDialogS2 extends AlertDialog implements DialogInterface { private OnMyFilePickerListener mListener; private String CurDir=""; //ArrayAdapter |