简体   繁体   中英

Xamarin - call fragment method from MainActivity

I have a viewPager with 3 tab fragments. The code of tabFragment1 class (Note: 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";

    }

}

So, I want to call UpdateContent() method from MainActivity method:

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

    }

It works fine (cause I see I get correct itemIDs in Snackbar appearing every time I select a tab), but on the last row under if clause ...

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

... i see Visual Studio error pop-up saying, that

an object reference is required for the nonstatic field, method, or property 'tabFragment1.UpdateContent(fView)'

What is the best way to silve the problem? Thanks

public void UpdateContent(View v) is object's method not type's method. So for using it you need to create object of tabFragment1 and call it method. Or you can change declaration for UpdateContent(View v) to static UpdateContent(View v) and call it as type's method.

Changing declaration:

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

And using:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM