0
內創建片段

MainActivity具有BottomNavigationBar有4個選項卡,創建新的片段:片段Xamarin的Android

public class MainActivity : AppCompatActivity 
{ 
    int mainFragmentLayout; 

    protected override void OnCreate(Bundle bundle) 
    { 
     base.OnCreate(bundle); 
     SetContentView(Resource.Layout.Main); 
     mainFragmentLayout = Resource.Id.fragmentLayout; 
     var bottomNavigation = FindViewById<BottomNavigationView>(Resource.Id.bottom_navigation); 

     //Item in Navigation Bar clicked 
     bottomNavigation.NavigationItemSelected += (s, e) => 
     { 
      switch (e.Item.ItemId) 
      { 
       case Resource.Id.action_home: 
        //Create Fragment View when Item is Clicked 
        Fragment homeFragment = new HomeLayoutFragment(); 
        FragmentTransaction homeFragmentTx = FragmentManager.BeginTransaction(); 
        homeFragmentTx.Replace(mainFragmentLayout, homeFragment); 
        homeFragmentTx.Commit(); 
        break; 
       case Resource.Id.action_map: 
        //Create Fragment View when Item is Clicked 
        /* 
        Fragment mapFragment = new MapLayoutFragment(); 
        FragmentTransaction mapFragmentTx = FragmentManager.BeginTransaction(); 
        mapFragmentTx.Replace(mainFragmentLayout, mapFragment); 
        mapFragmentTx.Commit(); 
        */ 
        break; 
       case Resource.Id.action_camera: 
        //Create Fragment View when Item is Clicked 
        Fragment cameraFragment = new CameraLayoutFragment(); 
        FragmentTransaction cameraFragmentTx = FragmentManager.BeginTransaction(); 
        cameraFragmentTx.Replace(mainFragmentLayout, cameraFragment); 
        cameraFragmentTx.Commit(); 
        break; 
       case Resource.Id.action_profile: 
        //Create Fragment View when Item is Clicked 
        Fragment profileFragment = new ProfileLayoutFragment(); 
        FragmentTransaction profileFragmentTx = FragmentManager.BeginTransaction(); 
        profileFragmentTx.Replace(mainFragmentLayout, profileFragment); 
        profileFragmentTx.Commit(); 
        break; 
       default: 
        break; 
      } 
     }; 

從那裏,當我去到homeFragment,我創建了一個ImageButtons裏面GridView

class HomeLayoutFragment : Fragment 
{ 
    private const string TAG = "InfiniteScroll"; 
    private GridView _gridView; 
    private MySimpleItemLoader _mySimpleItemLoader; 
    private MyGridViewAdapter _gridviewAdapter; 
    private readonly object _scrollLockObject = new object(); 
    private const int ItemsPerPage = 24; 

    private const int LoadNextItemsThreshold = 6; 
    Context context; 
    public override void OnAttach(Context context) 
    { 
     base.OnAttach(context); 
     this.context = context; 
    } 

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

     _mySimpleItemLoader = new MySimpleItemLoader(); 
     _mySimpleItemLoader.LoadMoreItems(ItemsPerPage); 

     _gridView = view.FindViewById<GridView>(Resource.Id.gridview); 

     if (IsAdded) 
     { 
      _gridviewAdapter = new MyGridViewAdapter(context, _mySimpleItemLoader); 
      _gridView.Adapter = _gridviewAdapter; 
      _gridView.Scroll += KeepScrollingInfinitely; 
     } 

     return view; 
    } 

    private void KeepScrollingInfinitely(object sender, AbsListView.ScrollEventArgs args) 
    { 
     lock (_scrollLockObject) 
     { 
      var mustLoadMore = args.FirstVisibleItem + args.VisibleItemCount >= args.TotalItemCount - LoadNextItemsThreshold; 
      if (mustLoadMore && _mySimpleItemLoader.CanLoadMoreItems && !_mySimpleItemLoader.IsBusy) 
      { 
       _mySimpleItemLoader.IsBusy = true; 
       Log.Info(TAG, "Requested to load more items"); 
       _mySimpleItemLoader.LoadMoreItems(ItemsPerPage); 
       _gridviewAdapter.NotifyDataSetChanged(); 
       _gridView.InvalidateViews(); 
      } 
     } 
    } 
} 

我期望的行爲是ImageButtonsGridView點擊時,創建一個新的Fragment它添加到我的MainActivityFragmentManger。 從Fragment內部創建這些動態Fragments的最佳方法是什麼?

我應該在homeFragment課程中使用FragmentActivity嗎?我應該使用ViewPagerFragments嗎?我一整天都在看,而且我不確定最好的方法再被使用了。 謝謝。

回答

0

我建議使用它的佈局創建自適應Fragment,因爲創建靈活的佈局比每次創建新的片段更容易。

而且由於你使用BottomNavigationView,我覺得你的要求,第一個問題就是動態地添加項目到這個菜單,你可以在這樣的例子中,項目單擊事件做到這一點:

var bar = this.Activity.FindViewById<BottomNavigationView>(Resource.Id.bottom_navigation); 
var menu = bar.Menu; 
string itemstring = "XXXXX"; 
menu.Add(0, 1001, Menu.None, itemstring); 

然後它會在菜單中添加一個新項目。但由於它是動態的,所以當你的應用程序重新啓動時,這個項目將會丟失,你可以保存它並且每當你加載你的MainActivity時,檢查你保存的數據並添加菜單項。如果您在保存數據和檢索數據方面存在問題,則有許多方法,您可以使用它們進行搜索。

然後你可以在NavigationItemSelected這樣更改代碼:

... 
    default: 
     AdaptiveFragment fragment = new AdaptiveFragment(); 
     Bundle bd = new Bundle(); 
     var message = e.MenuItem.TitleFormatted.ToString(); 
     bd.PutString("message", message); 
     fragment.Arguments = bd; 
     transaction1.Replace(Resource.Id.framelayout, fragment).AddToBackStack(null).Commit(); 
     break; 
... 

AdaptiveFragment是這樣的:

public class AdaptiveFragment : Fragment 
{ 
    public override void OnCreate(Bundle savedInstanceState) 
    { 
     base.OnCreate(savedInstanceState); 

     // Create your fragment here 
    } 

    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    { 
     var view = inflater.Inflate(Resource.Layout.adaptivelayout, container, false); 
     string message = this.Arguments.GetString("message"); 
     //create dynamically view for this fragment based on the message. 
     return view; 
    } 
} 

佈局adaptivelayout是帶在我身邊有根RelativeLayout空的佈局。這裏的關鍵是根據GridView的項目使用字符串參數作爲菜單標題來創建菜單項。然後根據標題導航到AdaptiveFragment並將標題作爲參數傳遞給此片段,最後根據此字符串參數在Fragment中創建相對佈局和代碼邏輯。這裏的AdaptiveFragment更像是一個空容器。