【问题标题】:How to get the user's choice of File, back from a DialogFragment list如何从 DialogFragment 列表中获取用户对文件的选择
【发布时间】:2015-12-27 20:26:23
【问题描述】:

在寻找解决我的问题的方法时,我已经广泛阅读了关于 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)' 方法使用 2 个附加类,使用 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 上的许多现有答案,我不确定我是否已经陷入困境。许多答案都有与他们关联的侦听器使用的按钮,我没有,因此无法使用他们的代码(尤其是侦听器)来解决我的问题,其他人使用
启动 DF -- AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); -- 我没有使用的代码构造。 (我确实尝试过使用这种方法,但 .setItems 动词不喜欢我动态构建的文件列表,它只想要一个固定的数组,我无法让它工作)。

显然,我需要使用侦听器接口来将文件名返回到 MainActivity,但我不知道如何使其正常工作。 我尝试使用实现 AdapterView.OnItemSelectedListener 的 NewFileChooser,这迫使我实现下面的方法

@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

}

但我也无法让它工作。我正在使用 Android Studio,即使使用代码完成助手,我似乎也被卡住了。

恐怕这看起来像是……当您知道自己陷入困境时停止挖掘……!因此,我们将非常感谢您的任何帮助

【问题讨论】:

    标签: android listview android-fragments onclicklistener dialogfragment


    【解决方案1】:

    在你的父(调用者)片段中使用 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 调用父fragment中的onActivityResult。

    【讨论】:

    • 我遇到的问题是您的解决方案 Fred 的上游,如果没有 Listview 上的侦听器,我无法获得用户选择,大多数答案使用 onCreateDialog 方法中的构建器类来创建 DF 和将他们的侦听器附加到那里,我使用了 onCreateView,但我看不到将侦听器附加到列表视图以捕获用户点击的方法。
    • 我编辑我的回复,添加 onItemClick 和 onActivityCreated 部分
    • 我想我们快到了,我已经实施了您的修改/更改,它选择了选择的文件名,但是当它通过捆绑创建并通过解雇它没有找到它时回到启动它的 MainActivity 活动中的“onActivityResult”方法。
    • 这里有几点可能相关,您将我的父母(调用者)称为片段,实际上它是一个活动(MainActivity),并且在您的第一个代码框中包含“创建 DF ' 语句,在第 2 行 newFileChooser.setTargetFragment (this, FILE_CHOOSER);它不接受使用“this”,只接受 newFileChooser 作为允许的参数。我感觉它在 dismiss() 之后返回,但找不到正确对象的 onActivityResult 方法?
    • 我对你的问题的回答对我来说很好。但如果你想返回你的活动,你可以使用这个链接:stackoverflow.com/questions/15121373/…stackoverflow.com/questions/12622742/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-27
    • 1970-01-01
    • 1970-01-01
    • 2011-05-21
    • 1970-01-01
    • 2012-10-12
    • 1970-01-01
    相关资源
    最近更新 更多