1

ユーザーがアクションバーのアイテムをクリックすると、アクティビティにフラグメントを追加しようとしていますが、表示させることができません。これが私が期待するように機能していないメインコードです(これはMonodroidで書かれています):

public override bool OnOptionsItemSelected(IMenuItem item)
    {
      if (item.ItemId == Resource.Id.show_hide_notes)
      {
        notesLayout.Visibility = ViewStates.Visible;

        notesWebViewFragment = new NotesWebViewFragment();
        // linearLayout.LayoutParameters = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FillParent, LinearLayout.LayoutParams.WrapContent, 1);

        Android.Support.V4.App.FragmentTransaction fragmentTransaction = SupportFragmentManager.BeginTransaction();
        fragmentTransaction.Add(Resource.Id.notes_fragment_container, notesWebViewFragment);
        fragmentTransaction.Commit();

        // Adding this line doesn't help
        // FindViewById<LinearLayout>(Resource.Id.plex_frame_container).Invalidate();
      }
      return true;
    }

このフラグメントをOnCreateメソッドの他のフラグメントと一緒に追加すると、期待どおりの結果が得られます。私はこれを表示するためにいくつかの異なる方法を試しました。私が間違っていることの説明は大歓迎です。以下に、残りの関連コードを追加しました。

 [Activity]
  public class BrainViewActivity : Android.Support.V4.App.FragmentActivity
  {
    private Brain activeBrain;

    PlexWebViewFragment plexWebViewFragment;
    NotesWebViewFragment notesWebViewFragment;

    FrameLayout notesLayout;

    protected override void OnCreate(Bundle savedInstanceState)
    {
      base.OnCreate(savedInstanceState);

      SetContentView(Resource.Layout.brain_view);

      notesLayout = FindViewById<FrameLayout>(Resource.Id.notes_fragment_container);
      // notesLinearLayout.LayoutParameters = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FillParent, LinearLayout.LayoutParams.WrapContent, 0);
      notesLayout.Visibility = ViewStates.Gone;

      if (savedInstanceState == null)
      {
        // Create an instance of PlexWebViewFragment
        plexWebViewFragment = new PlexWebViewFragment();
      }

      // Check that the activity is using the layout version with
      // the fragment_container FrameLayout
      if (FindViewById(Resource.Id.plex_fragment_container) != null)
      {
        plexWebViewFragment.Arguments = Intent.Extras;

        Android.Support.V4.App.FragmentTransaction fragmentTransaction = SupportFragmentManager.BeginTransaction();
        fragmentTransaction.Add(Resource.Id.plex_fragment_container, plexWebViewFragment);

        fragmentTransaction.Commit();
      }
    }

    public override bool OnCreateOptionsMenu(IMenu menu)
    {
      base.OnCreateOptionsMenu(menu);
      MenuInflater.Inflate(Resource.Menu.brain_view_menu, menu);

      return true;
    }

    public override bool OnOptionsItemSelected(IMenuItem item)
    {
      if (item.ItemId == Resource.Id.show_hide_notes)
      {
        notesLayout.Visibility = ViewStates.Visible;

        notesWebViewFragment = new NotesWebViewFragment();
        // linearLayout.LayoutParameters = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FillParent, LinearLayout.LayoutParams.WrapContent, 1);

        Android.Support.V4.App.FragmentTransaction fragmentTransaction = SupportFragmentManager.BeginTransaction();
        fragmentTransaction.Add(Resource.Id.notes_fragment_container, notesWebViewFragment);
        fragmentTransaction.Commit();

        // Adding this line doesn't help
        // FindViewById<LinearLayout>(Resource.Id.plex_frame_container).Invalidate();
      }
      return true;
    }
  }

xmlビュー:

<?xml version="1.0" encoding="utf-8" ?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/plex_frame_container"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical">
  <FrameLayout
    android:id="@+id/plex_fragment_container"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_weight="1"/>

  <FrameLayout
    android:id="@+id/notes_fragment_container"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_weight="1"/>
</LinearLayout>

フラグメントをすぐに追加すると、これは機能します。そうしないと、後で追加しようとしても、アクティビティのビューが変更されてフラグメントが表示されることはありません。アクティビティに塗り直しを指示する必要があるように?どんな助けでもいただければ幸いです。前もって感謝します。

4

1 に答える 1

2

これが他の誰かを助ける場合、私は問題が何であるかを理解しました。新しいフラグメントを追加した後、をリレーアウトする必要がありましたActivity。私が検索していたものから、私は次のようにinvalidateを呼び出すことについてのコメントを見ていました:

FindViewById<LinearLayout>(Resource.Id.plex_frame_container).Invalidate();

ただし、これは正しくなく(少なくとも私の場合)、ビューのサイズを変更(またはより正確にリレーアウト)することはできません。しかし、呼び出しRequestLayoutは私が必要としたことを正確に実行し、フラグメントが表示され始めました。例:

FindViewById<LinearLayout>(Resource.Id.plex_frame_container).RequestLayout();

お役に立てれば。

于 2013-02-27T02:42:24.523 に答える