【问题标题】:Android - Start Fragemnt from another Fragment C#Android - 从另一个片段 C# 启动片段
【发布时间】:2018-06-02 21:40:18
【问题描述】:

我知道这个问题在这里被问得太多,但我已经尝试了所有解决方案来打开另一个片段中的片段,但没有人为我工作。

Fragment1.cs

public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    base.OnCreate(savedInstanceState);
    View view = inflater.Inflate(Resource.Layout.my_layout, container, false);
    return view;
    add.Click += delegate
        {
            Fragment2 fragment2 = new Fragment2();
            FragmentTransaction ft = FragmentManager.BeginTransaction();
            ft.Replace(Resource.Id.content_frame, fragment2);
            ft.Commit();
         };
}

my_layout

 <?xml version="1.0" encoding="utf-8"?>
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/content_frame">
<TextView
    android:text="Text"
    android:layout_width="match_parent"
    android:layout_height="70dp"
    android:id="@+id/total"
    android:textAlignment="center"
    android:textSize="30dp" />
<TextView
    android:text="Text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/textchangevalue"
    android:textSize="33dip"
    android:textStyle="bold" />
<Button
    android:text="UPDATE"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/updatebtn" />
 <Button
    android:text="ADD"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/addbtn" />
 <ListView
    android:minWidth="25px"
    android:minHeight="25px"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/portfoliolist"
    android:clickable="true" />

Fragment2.cs

public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        View view = inflater.Inflate(Resource.Layout.fragment_lay, container, false);

        TextView txt = view.FindViewById<TextView>(Resource.Id.textView1);
        Button btn = view.FindViewById<Button>(Resource.Id.button1);
        listView = view.FindViewById<ListView>(Resource.Id.listView1);
        Toast.MakeText(Activity, "Fragment2 started", ToastLength.Short).Show();
        return view;
       }

当我运行应用程序并单击add 按钮时,没有任何反应。这是为什么 ?我试图通过将&lt;LinearLayout&gt; 替换为&lt;FrameLayout&gt; 来更改Fragment1 的布局,但也没有成功。请帮助我找到解决方案。

编辑: 我在Fragment2 中添加了toast 消息,当我单击fragment1 中的add 按钮时,toast 消息(位于fragment2 中)正在显示,这意味着@987654334 @ 开始正常,但它的布局没有显示在屏幕上。

【问题讨论】:

  • 您试图在方法返回后附加一个侦听器,这永远不会发生。
  • 您好,我的回答对您有用吗?
  • @JoeLv-MSFT 是的,但你能告诉我如何在按钮单击时从片段中高亮NavuagtionDrawer 项目吗?因为现在当我单击按钮时,它会将我带到第二个片段,但当我滑动 Navigationdrawer 菜单时,第一个片段仍然是突出显示的片段。

标签: c# android android-fragments xamarin fragment


【解决方案1】:

您需要一个FrameLayout 来包含您的LinearLayout

<?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"
    android:id="@+id/content_frame">
  <LinearLayout
android:id="@+id/ll"
      android:orientation="vertical"
      android:layout_width="match_parent"
      android:layout_height="match_parent">


    <TextView
        android:text="Text"
        android:layout_width="match_parent"
        android:layout_height="70dp"
        android:id="@+id/total"
        android:textAlignment="center"
        android:textSize="30dp" />
    <TextView
        android:text="Text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/textchangevalue"
        android:textSize="33dip"
        android:textStyle="bold" />
    <Button
        android:text="UPDATE"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/updatebtn" />
    <Button
        android:text="ADD"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/addbtn" />
    <ListView
        android:minWidth="25px"
        android:minHeight="25px"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/portfoliolist"
        android:clickable="true" />
  </LinearLayout>
</FrameLayout>

你的代码应该是:

    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        // Use this to return your custom view for this Fragment
        var view = inflater.Inflate(Resource.Layout.my_layout, container, false);
        var ll = view.FindViewById<LinearLayout>(Resource.Id.ll);
        var bt = view.FindViewById(Resource.Id.addbtn);
        bt.Click+= delegate
        {
            Fragment2 fragment2 = new Fragment2();
            FragmentTransaction ft = FragmentManager.BeginTransaction();
            ft.Replace(Resource.Id.content_frame, fragment2);
            ft.Commit();
            ll.Visibility = ViewStates.Gone;
        };
        return view;
    }

您可以参考this 了解为什么您的fragment2 只是在上面。我使用ll.Visibility = ViewStates.Gone; 来避免它。

【讨论】:

  • 请你检查这个线程here
  • 我看到了,不过今天很忙,下周再做吧。
  • 您是否介意也检查一下这个线程here
【解决方案2】:

您必须将您的Click 事件附加到您的按钮之前 return view,我认为您想将此事件附加到您的addbtn 所以您必须在附加此事件之前创建变量add

public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    base.OnCreate(savedInstanceState);
    View view = inflater.Inflate(Resource.Layout.my_layout, container, false);
    Button add = view.FindViewById<Button>(Resource.Id.addbtn);
    add.Click += delegate
    {
        Fragment2 fragment2 = new Fragment2();
        FragmentTransaction ft = FragmentManager.BeginTransaction();
        ft.Replace(Resource.Id.content_frame, fragment2);
        ft.Commit();
    };
    return view;
}

【讨论】:

  • 不,没有用。我已经在事件之后放置了return view,没有任何改变,当我点击add 按钮时仍然没有发生任何事情。
【解决方案3】:

您可以改用事件:

public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    base.OnCreate(savedInstanceState);
    View view = inflater.Inflate(Resource.Layout.my_layout, container, false);
    Button add = view.FindViewById<Button>(Resource.Id.addbtn);
    add.Click += (object sender, EventArgs e) =>
    {
        Fragment2 fragment2 = new Fragment2();
        FragmentTransaction ft = FragmentManager.BeginTransaction();
        ft.Replace(Resource.Id.content_frame, fragment2);
        ft.Commit();
    };

    return view;
}

【讨论】:

  • 我试过了,还是不行。但是我在Fragment2 中放了一条toast 消息,当我单击fragment1 中的add 按钮时,正在显示toast 消息,这意味着fragment2 正在启动但未显示。
  • @Wassim01 发布您的 Fragment 和 XML 的代码。如果把toast放在事件里,只表示事件被触发了
  • 我已经编辑了我的问题,另外,toast 在 fragment2 中,这意味着add 按钮事件正在触发,并且 fragment2 启动良好,但它的布局没有显示在屏幕上
  • @Wassim01 完成片段中的 onCreate 后需要返回视图
  • 我做了,但我忘了把它放在我上面的代码中。对不起。实际上,如果你不输入return view,visualstudio 会抛出错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多