簡體   English   中英

從FragmentPagerAdapter調用活動方法

[英]Calling activity method from FragmentPagerAdapter

我的MainActivity具有一個double緯度值,我想將其傳遞給FragmentPagerAdapter內部的一個FragmentPagerAdapter ,因此我在MainActivity.java創建了該getter方法:

public double getLatitude() {
   return this.latitude;
}

現在,我嘗試在創建該值時將其傳遞給一個片段( getItem()方法是FragmentPagerAdapter類的一部分):

    public Fragment getItem(int position) {
            if (position == 0) {
                return new Fragment1();
            } else if (position == 1) {
                return new Fragment2();
            } else {
                Fragment3 fragment3 = new Fragment3();
                Bundle args = new Bundle();
                args.putDouble(fragment3.ARG_PARAM1, getActivity().getLatitude());
                fragment3.setArguments(args);
                return fragment3;
            }
        }

但是,我得到一個編譯錯誤,指出Error:(156, 68) error: cannot find symbol method getActivity()

創建片段的新實例時,如何獲取主要活動的getLatitude()

您為什么不在Adapter的Constructor中傳遞該值,例如

假設您的適配器類名稱為ViewPagerPagerAdapter,然后在該適配器中執行以下操作

public class ViewPagerPagerAdapter extends FragmentPagerAdapter {

private double mLattitude;
public ViewPagerPagerAdapter (double lattitude) {
    this.mLattitude = lattitude;
}

//Now use that mLattitude wherever you want

public Fragment getItem(int position) {
            if (position == 0) {
                return new Fragment1();
            } else if (position == 1) {
                return new Fragment2();
            } else {
                Fragment3 fragment3 = new Fragment3();
                Bundle args = new Bundle();
                args.putDouble(fragment3.ARG_PARAM1, mLattitude);
                Log.d("WHATEVER", "WHATEVER: " + String.valueOf(mLattitude));
                fragment3.setArguments(args);
                return fragment3;
            }
        }
}

現在,當您從MainActivity啟動適配器時,請執行

ViewPagerAdapter adapter = new ViewPagerAdapter(lattitude);

FragmentPagerAdapter不是Fragment ,即它沒有getActivity()方法。 如果您需要從活動中訪問緯度,只需將活動引用傳遞給FragmentPagerAdapter構造函數。 使用此處的接口,像LatitudeProvider這樣的東西將更加靈活。

例:

class MainActivity extends Activity implements LatitudeProvider {

    // pager adapter creation
    new MyFragmentPagerAdapter(this);

    @Override
    public double getLatitude() {
        return this.latitude;
    }
}

您的片段尋呼機適配器:

interface LatitudeProvider {
    double getLatitude();
}

public class MyFragmentManagerAdapter extends FragmentPagerAdapter {
    private final LatitudeProvider latitudeProvider;

    public MyFragmentManagerAdapter(LatitudeProvider latitudeProvider) {
        this.latitudeProvider = latitudeProvider;
    }

    ...
    // Now you can get your latitude like this:
    latitudeProvider.getLatitude();
}

getActivity()返回上下文不是MainActivity的對象。 據我所知,沒有辦法在android中獲取Activity的當前對象。 因此,您應按以下方式將其設為公開和靜態。

public static double getLatitude() {
   return this.latitude;     // make latitude public and static as well 
}

現在在您的MainActivity.java中

MainActivity.getLatitude();

如果價值沒有改變。 然后,您可以在構造函數中傳遞它。

暫無
暫無

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

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