在活动中按ID获取片段

时间:2014-05-05 07:21:44

标签: c# android xamarin

我有以下布局:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <fragment
        class="com.xamarin.recipes.filepicker.FileListFragment"
        android:id="@+id/FileListFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</FrameLayout>

之后我试图访问Activity中的FileListFragment:

var fileListFragment = SupportFragmentManager.FindFragmentById(Resource.Id.FileListFragment);

但是我得到了#34;未知标识符:fileListFragment&#34;在Watches for fileListFragment

更新

活动代码:

using Android.Support.V4.App;
using Android.OS;

namespace com.xamarin.recipes.filepicker
{
    [Android.App.Activity(Label = "Choose file", MainLauncher = true, Icon = "@drawable/icon")]
    public class FilePickerActivity : FragmentActivity
    {
        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);
            SetContentView(Resource.Layout.ChooseAudio);

            var fileListFragment = (FileListFragment)SupportFragmentManager.FindFragmentById(Resource.Id.FileListFragment);
        }
    }
}

7 个答案:

答案 0 :(得分:2)

我目前没有使用Xamarin,但我取消删除我的答案,因为我认为我接近解决方案,这可以帮助你。我找到了几个使用Xamarin的教程或GitHub项目。这些搜索没有给我正确的解决方案,但我认为它们为我提供了解决问题的线索。试试这段代码:

using Android.App;
using Android.OS;
using Android.Support.V4.App;
// using Fragment = Android.Support.V4.App.Fragment;

namespace com.xamarin.recipes.filepicker
{
    [Activity(Label = "Choose file", MainLauncher = true, Icon = "@drawable/icon")]
    public class FilePickerActivity : FragmentActivity
    {
        // use Android.Support.V4.App.Fragment below
        private FileListFragment mFileListFragment; 

        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);
            SetContentView(Resource.Layout.ChooseAudio);

            mFileListFragment = (FileListFragment)SupportFragmentManager.FindFragmentById(Resource.Id.fileListFragment);
            // Avoid any confusion: change its id in your layout by "fileListFragment"
        }
    }
}   

我使用片段类var更改了使用Android.Support.V4.App.Fragment未定义的FileListFragment,因为错误显示:未知标识符

注意:请确保FileListFragment扩展Android.Support.V4.App.Fragment,如下所示:

public class FileListFragment : Android.Support.V4.App.Fragment
{
  ...
}  

要使用var,我猜您需要通过as Android.Support.V4.App.Fragment(比较器)进行转换,如下所示:

var fileListFragment = SupportFragmentManager
                       .FindFragmentById(Resource.Id.fileListFragment)
                       as FileListFragment; // you need this line

答案 1 :(得分:1)

试试这段代码。我不确定,但我认为它应该有用。

var fileListFragment = SupportFragmentManager.FindFragmentById<FileListFragment>(Resource.Id.FileListFragment);

答案 2 :(得分:0)

使用此:

 getSupportFragmentManager()
                        .findFragmentById(R.id.FileListFragment))

答案 3 :(得分:0)

  

您是否尝试过像这样的片段

 Fragment fileListFragment = SupportFragmentManager.findFragmentById(R.id.FileListFragment);

答案 4 :(得分:0)

你已经知道你尝试过的方法不会起作用,所以我不会再说一遍了。 请注意,Fragment的视图无法像这样访问。 尝试使用ADT创建带有选项卡导航的项目,然后查看代码,它将阐明您的概念。 该向导还将为您生成一个虚拟选项卡片段类,它看起来像

public static class FragHomeUI extends Fragment

将在类的后续成员内创建并访问片段视图:

    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState)
{
            View rootView = inflater.inflate(R.layout.fragment_home, container,
                    false);

再说一遍,通过ADT向导创建一些示例项目并仔细观察代码。

答案 5 :(得分:0)

它可能有帮助。

FragmentManager fm = getSupportFragmentManager();
Fragment fragment_byID = fm.findFragmentById(R.id.fragment_id);
//OR
Fragment fragment_byTag = fm.findFragmentByTag("fragment_tag");

答案 6 :(得分:0)

请在Xamarin.Android 4.12.02001中尝试此代码:

FileListFragment fileListFragment = Android.Runtime.Extensions.JavaCast<FileListFragment>(SupportFragmentManager.FindFragmentById(Resource.Id.id_file_list_fragment));