簡體   English   中英

Xamarin-MainActivity的調用片段方法

[英]Xamarin - call fragment method from MainActivity

我有一個帶有3個標簽片段的viewPager。 tabFragment1類的代碼(注意:V4Fragment = Android.Support.V4.App.Fragment):

class tabFragment1 : V4Fragment
{

    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle saved)
    {
        var v = inflater.Inflate(Resource.Layout.tabLayout1, container, false);

        // Set weather icon
        ImageView iv_icon = v.FindViewById<ImageView>(Resource.Id.iv_icon);
        iv_icon.SetImageResource(Resource.Drawable.ic_weather_cloudy_white_48dp);
        Snackbar.Make(container, "tabFragment; onCreateView()", Snackbar.LengthLong).Show();
        //UpdateContent(v);
        return v;
    }

    public void UpdateContent(View v)
    {

        // Sample values to read
        string locationCode = "528454";

        // Mapping views
        TextView tv_currentConditions = v.FindViewById<TextView>(Resource.Id.currentConditions);
        TextView tv_currentTemperature = v.FindViewById<TextView>(Resource.Id.currentTemperature);
        TextView tv_currentRealFeel = v.FindViewById<TextView>(Resource.Id.currentRealFeel);
        TextView tv_minMaxTemperature = v.FindViewById<TextView>(Resource.Id.minMaxTemperature);

        // Update view from database
        tv_currentConditions.Text = Sql.ReadValue(locationCode,"currentConditions");
        tv_currentTemperature.Text = Sql.ReadValue(locationCode, "currentTemperature") + "°C";
        tv_currentRealFeel.Text = GetString(Resource.String.feelLike) + " " + Sql.ReadValue(locationCode, "currentRealFeel") + "°C";
        tv_minMaxTemperature.Text = Sql.ReadValue(locationCode, "minTemperature") + " " + Sql.ReadValue(locationCode, "maxTemperature") + "°C";

    }

}

因此,我想從MainActivity方法中調用UpdateContent()方法:

public void UpdateCurrentTab()
    {

        ViewPager viewPager = FindViewById<ViewPager>(Resource.Id.viewpager);
        int currentItem = viewPager.CurrentItem;
        Snackbar.Make(drawerLayout, "CALL TO UPDATE Tab " + currentItem, Snackbar.LengthLong).Show();
        View fView = viewPager.GetChildAt(currentItem);
        if (currentItem == 1) { tabFragment1.UpdateContent(fView); }

    }

它工作正常(因為我看到每次選擇選項卡時我都會在Snackbar中看到正確的itemID),但是在if子句下的最后一行...

if (currentItem == 1) { tabFragment1.UpdateContent(fView); }

...我看到Visual Studio錯誤彈出窗口說,

非靜態字段,方法或屬性'tabFragment1.UpdateContent(fView)'需要對象引用

解決問題的最佳方法是什么? 謝謝

public void UpdateContent(View v)是對象的方法,而不是類型的方法。 因此,要使用它,您需要創建tabFragment1對象並調用它的方法。 或者,您可以將UpdateContent(View v)聲明更改為static UpdateContent(View v)並將其作為類型的方法進行調用。

更改聲明:

public static void UpdateContent(View v)
{
    // Put here your code from question       
}

並使用:

public void UpdateCurrentTab()
{
    ViewPager viewPager = FindViewById<ViewPager>(Resource.Id.viewpager);
    int currentItem = viewPager.CurrentItem;
    Snackbar.Make(drawerLayout, "CALL TO UPDATE Tab " + currentItem, Snackbar.LengthLong).Show();
    View fView = viewPager.GetChildAt(currentItem);
    if (currentItem == 1) 
    { 
        // Now it's a type's method not object's
        tabFragment1.UpdateContent(fView); 
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM