如何从DialogFragment列表中获取用户对File的选择

时间:2015-12-27 20:26:24

标签: android listview android-fragments onclicklistener dialogfragment

我在搜索问题的解决方案时已经对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工作室,甚至使用代码完成助手,我似乎很困难。

我担心这看起来像......当你知道你在一个洞里挖掘......时!因此,非常感谢任何协助

1 个答案:

答案 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。