微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Xamarin Android从片段实例获取视图

如何解决Xamarin Android从片段实例获取视图

这是我的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,false);
        return DashboardView;
    }
}

这是我的MainActivity.cs,我创建了仪表板片段的一个实例

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

谢谢

解决方法

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

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

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

然后在Activity OnResume()OnStart()方法中获取DashboardTab fragemnt:

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

  
,

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

在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;
        }

或者,如果您的更改取决于片段所附加到的“活动”,则可以使用片段的OnActivityCreated方法。

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

            var act = (MainActivity)Activity;
        }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。