【问题标题】:Xamarin Android Get View from Fragment InstanceXamarin Android 从片段实例获取视图
【发布时间】:2020-11-08 13:48:58
【问题描述】:

这是我的 xml 文件

<LinearLayout
    android:orientation="vertical"
    android:minWidth="25px"
    android:minHeight="25px"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginBottom="40dp"
    android:id="@+id/MainPersonalIDLayout">
    <TextView
        android:text="Personal ID"
        android:textSize="18dp"
        android:textColor="#000"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="50dp"
        android:id="@+id/PersonalIDTitle" />
    <LinearLayout
        android:orientation="horizontal"
        android:minWidth="25px"
        android:minHeight="25px"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:id="@+id/SubPersonalIDLayout">
        <TextView
            android:text="No ID"
            android:textSize="20dp"
            android:gravity="center"
            android:layout_width="200dp"
            android:layout_height="match_parent"
            android:id="@+id/PersonalID" />
        <Button
            android:text="Use this"
            android:textAllCaps="false"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:onClick="UsePersonalID"
            android:id="@+id/UsePersonalID" />
    </LinearLayout>
</LinearLayout>

这是我的仪表板片段

public class DashboardTab : Fragment
{
    View DashboardView;
    public override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);

        // Create your fragment here
    }

    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        // Use this to return your custom view for this Fragment
        // return inflater.Inflate(Resource.Layout.YourFragment, container, false);

        DashboardView = inflater.Inflate(Resource.Layout.Dashboard, container, false);
        return DashboardView;
    }
}

这是我的 MainActivity.cs,我创建了 Dashboard 片段的实例

SetContentView(Resource.Layout.activity_main);
DashboardTab Dashboard = new DashboardTab();
TextView PersonalIDHolder = Dashboard.View.FindViewById<TextView>(Resource.Id.PersonalID);

这是我运行时显示的错误 System.NullReferenceException: '对象引用未设置为对象的实例。'

是否可以从 Fragment 的实例中获取视图?

Android get view of fragment in activity

谢谢

【问题讨论】:

    标签: android xamarin xamarin.android


    【解决方案1】:

    是的,您将收到 System.NullReferenceException,因为您试图在活动的 onCreate 方法中访问 Fragment 的视图,并且到目前为止,片段视图尚未初始化。

    在 Fragment 的 OnCreateView 方法中更新您的视图

    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
            {
    
                var DashboardView = inflater.Inflate(Resource.Layout.Dashboard, container, false);
    TextView textView = View.FindViewById<TextView>(Resource.Id.PersonalID);
                return DashboardView;
            }
    

    或者如果您的更改依赖于您的 Fragment 附加到的 Activity,那么您可以使用 Fragment 的 OnActivityCreated 方法。

    public override void OnActivityCreated(Bundle savedInstanceState)
            {
                base.OnActivityCreated(savedInstanceState);
                TextView textView = View.FindViewById<TextView>(Resource.Id.PersonID);
    
                var act = (MainActivity)Activity;
            }
    

    【讨论】:

    • 哦,这就是为什么它总是显示未设置对象实例的对象引用,谢谢
    【解决方案2】:

    答案是肯定的。我不知道你如何获取片段的实例,但有一种方法可以通过FindFragmentByTag 获取片段。

    添加 Fragment 时,您可以执行以下操作:

     SupportFragmentManager
                .BeginTransaction()
                .Add(Resource.Id.settingsContainer, new DashboardTab() , "DashboardTab") 
                .Commit();
    

    然后在ActivityOnResume()OnStart()方法中获取DashboardTab片段:

    protected override void OnResume()
        {
            base.OnResume();
            DashboardTab Dashboard = SupportFragmentManager.FindFragmentByTag("DashboardTab");
            TextView textView =  Dashboard.View.FindViewById<TextView>(Resource.Id.PersonalID);
        }
    
      
    

    【讨论】:

    • 抱歉,我忘了包含它,DashboardTab Dashboard;仪表板 = 新仪表板选项卡();
    • 所以我需要从 SupportFragmentManager 获取它?
    • 如果你使用DashboardTab Dashboard; Dashboard = new DashboardTab(); ,它也可以工作。如果你使用SupportFragmentManager.FindFragmentByTag,它将确保你不必在其他页面上重复`new DashboardTab()`。跨度>
    • 哦,所以我只需要添加我所有的片段添加开头然后根据我需要的片段替换它们吗?
    • 不,你不需要添加所有片段,我的意思是在你添加片段并为它定义一个标签后,你可以在你想要的时候通过它的标签来获取它,避免调用@ 987654328@
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-04
    相关资源
    最近更新 更多