我在搜索问题的解决方案时已经对S / O的各种答案进行了大量阅读,但现在看起来似乎是围成一圈,因为它们并没有出现成为DialogFragment(DF)创建和处理的一致方法,我已经能够用它来解决我的问题。
我正在运行一个包含许多普通片段的活动。我创建了一个DF来处理文件列表,我希望用户从中选择一个文件,然后将其导入(到SQLite数据库文件中)。 我通过以下代码从我的MainActivity创建DF(通过普通片段中的按钮点击发起): -
public void importdb(View view) {
NewFileChooser newFileChooser = new NewFileChooser();
newFileChooser.setTargetFragment(newFileChooser, FILE_CHOOSER);
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.addToBackStack(null);
newFileChooser.show(ft, "Diag");
}
在NewFileChooser' DF是在OnCreateView方法中创建的: -
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.new_layout, container, false);
list = (ListView)view.findViewById(R.id.file_list);
Context c = getActivity();
currentDir = new File("/sdcard/PH100-Backup");
fill(currentDir);
Dialog mydialog = getDialog();
mydialog.setTitle("Choose a database File to Import");
//list.setOnClickListener(???????????); // position to set listener ??
return view;
}
' fill(currentDir)'下面显示的方法使用另外两个类,使用ArrayAdapter从sdcard / backup目录获取文件并在DF的列表区域中显示此排序列表。 这部分工作正常,创建DF并显示列表,如果单击列表中的任何文件,背景会变亮,表示您正在启动事件,但这是我可以得到的。
private void fill(File f) {
File[] dirs = f.listFiles();
getDialog().setTitle("Current Dir: " + f.getName());
List<Option> dir = new ArrayList<Option>();
List<Option> fls = new ArrayList<Option>();
try {
for (File ff : dirs) {
if (ff.isDirectory())
dir.add(new Option(ff.getName(), "Folder", ff.getAbsolutePath()));
else {
fls.add(new Option(ff.getName(), "File Size: " + ff.length(), ff.getAbsolutePath()));
}
}
} catch (Exception e) {
}
Collections.sort(dir);
Collections.sort(fls);
dir.addAll(fls);
if (!f.getName().equalsIgnoreCase("sdcard"))
adapter = new FileArrayAdapter(getActivity(), R.layout.file_view, dir);
list.setAdapter(adapter);
}
代码主要是从勾选的代码中提取的。回答File Chooser inside DialogFragment (re-using code)
我已经修改了这个以适应我的情况并且它有效,但仅限于我上面提到的。
通过阅读S / O中的许多现有答案,我不确定自己是否已将自己挖到一个洞中。许多答案都有与他们相关的听众使用的按钮,我没有,因此无法使用他们的代码(尤其是听众)来解决我的问题,其他人则使用
- AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); -
我没有使用的代码构造。 (我确实尝试使用这种方法,但.setItems动词并不像我的动态构建的文件列表,它只是想要一个固定的数组,而我无法让它工作)。
显然,我需要使用监听器接口作为将文件名恢复为MainActivity的方法,但我不知道如何使其工作。 我尝试使用NewFileChooser实现AdapterView.OnItemSelectedListener,这迫使我实现下面的方法
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
}
但是,我也无法让它发挥作用。我使用Android工作室,甚至使用代码完成助手,我似乎很困难。
我担心这看起来像......当你知道你在一个洞里挖掘......时!因此,非常感谢任何协助
答案 0 :(得分:0)
在父(调用者)片段中使用onActivityResult。
执行以下步骤: 像这样更改创建DF(将其发送到setTargetFragment):
NewFileChooser newFileChooser = new NewFileChooser();
newFileChooser.setTargetFragment(this, FILE_CHOOSER);
FragmentTransaction ft = getFragmentManager().beginTransaction();
newFileChooser.show(ft, "Diag");
将此方法添加到调用者片段
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
if (requestCode == FILE_CHOOSER && resultCode == Activity.RESULT_OK)
{
Bundle b = data.getExtras();
String fileName= b.getString("FileName");
//Code
}
}
DF必须是继承AdapterView.OnItemClickListener
并实现类似这样的方法
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
{
Fragment targetFragment = getTargetFragment();
if (targetFragment != null)
{
Intent intent = new Intent();
Bundle bundle = new Bundle();
bundle.putString("FileName", /*Selected File Name*/);
intent.putExtras(bundle);
targetFragment.onActivityResult(getTargetRequestCode(), Activity.RESULT_OK, intent);
this.dismiss();
}
}
最终覆盖DF
中的onActivityCreated@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState)
{
super.onActivityCreated(savedInstanceState);
list.setOnItemClickListener(this);
}
targetFragment.onActivityResult调用父片段中的onActivityResult。