Android 在片段内调用方法

Android 在片段内调用方法,android,android-fragments,Android,Android Fragments,PageAdapter: class SampleFragmentPagerAdapter extends FragmentPagerAdapter { private int PAGE_COUNT = 3; private String tabTitles[]; public SampleFragmentPagerAdapter(FragmentManager fm, String[] categorie) { super(fm); PAGE_COUNT = categor

PageAdapter

class SampleFragmentPagerAdapter extends FragmentPagerAdapter {

private int PAGE_COUNT = 3;
private String tabTitles[];

public SampleFragmentPagerAdapter(FragmentManager fm, String[] categorie) {
    super(fm);
    PAGE_COUNT = categorie.length;
    tabTitles = new String[categorie.length];

    for(int i = 0; i < categorie.length; i++){
        tabTitles[i] = categorie[i];
    }
}

@Override
public int getCount() {
    return PAGE_COUNT;
}

@Override
public Fragment getItem(int position) {
    return Pagina.newInstance(position + 1);
}

@Override
public CharSequence getPageTitle(int position) {
    // Generate title based on item position
    return tabTitles[position];
}
}
主要活动:

public class PrincipaleActivity extends FragmentActivity{

public String[] categorie;

private String linguaApp = Locale.getDefault().getLanguage();
private Boolean linguaPresente = false;

private float scale;

private NetworkImageView imgProdotto;
private ViewPager pager;
private PagerSlidingTabStrip tabs;

private int screenWidth;
private int screenHeight;

private JSONObject dati;




@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_principale);

    Intent intent = getIntent();

    try {
        dati = new JSONObject(intent.getStringExtra("DatiArticolo"));
        checkLingua();
    } catch (JSONException e) {
        e.printStackTrace();
        Log.e("ERRORE", "Errore durante il parsing del JSONObject o del checkLingua");
    }

    ((myMainScrollView)findViewById(R.id.scrollPrincipale)).setScrollingEnabled(false);

    creaCategorie();
    caricaImgProdotto();

    // Initialize the ViewPager and set an adapter
    pager = (ViewPager) findViewById(R.id.pager);
    pager.setAdapter(new SampleFragmentPagerAdapter(getSupportFragmentManager(),categorie));

    // Bind the tabs to the ViewPager
    tabs = (PagerSlidingTabStrip) findViewById(R.id.tabs);
    tabs.setViewPager(pager);

    setDimensioniSchermo();
    inizializzaPagina();

}

private void creaCategorie(){
    categorie = new String[dati.optJSONArray("categorie").length()];

    for (int h = 0; h < dati.optJSONArray("categorie").length(); h++){
        try {
            JSONObject temp = (JSONObject) dati.optJSONArray("categorie").get(h);
            categorie[h] = temp.optJSONObject("nome").optString(linguaApp);
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
}

private void caricaImgProdotto(){
    imgProdotto = (NetworkImageView) findViewById(R.id.imgProdotto);

    String url = "http://46.101.209.16/"+dati.optJSONObject("anagrafica").optJSONObject(linguaApp).optJSONObject("img").optString("path");
    Log.e("LINK IMG", url);

    ImageLoader imageLoader = MyImageLoader.getInstance(this.getApplicationContext()).getImageLoader();
    imageLoader.get(url, ImageLoader.getImageListener(imgProdotto, R.drawable.icona_flash, android.R.drawable .ic_dialog_alert));
    imgProdotto.setImageUrl(url, imageLoader);
}

private void checkLingua() throws JSONException {
    JSONArray valLingue = dati.optJSONObject("lingue").optJSONArray("lingueApp");


    for(int i = 0; i < valLingue.length(); i++){
        if(valLingue.get(i).equals(linguaApp)){
            linguaPresente = true;
        }
    }
    if (linguaPresente == false){
        linguaApp = dati.optJSONObject("lingue").optString("principale");
    }

    Log.e("Lingua Scelta ",linguaApp);
}

private void setDimensioniSchermo(){
    scale = getResources().getDisplayMetrics().density;

    Display display = getWindowManager().getDefaultDisplay();
    Point size = new Point();
    display.getSize(size);
    screenWidth = size.x;
    screenHeight = size.y;
}

private void inizializzaPagina(){
    imgProdotto.getLayoutParams().height = (screenWidth/3)*2;
    tabs.getLayoutParams().height = (int)(scale * 30);
    pager.getLayoutParams().height = screenHeight - (int)(scale * 30);
}

}
公共类PrincipalActivity扩展了FragmentActivity{
公共字符串[]分类;
私有字符串linguaApp=Locale.getDefault().getLanguage();
私有布尔语言LinguarPresente=false;
私人浮动比例;
专用网络图像视图imgProdotto;
私人寻呼机;
专用页滑动选项卡;
私有整数屏幕宽度;
私人室内屏幕高度;
私有JSONObject dati;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_principale);
Intent=getIntent();
试一试{
dati=新的JSONObject(intent.getStringExtra(“DatiArticolo”);
checkLingua();
}捕获(JSONException e){
e、 printStackTrace();
Log.e(“ERRORE”,“ERRORE durante il解析del JSONObject o del checkLingua”);
}
((myMainScrollView)findViewById(R.id.scrollPrincipale)).setScrollingEnabled(false);
creaCategorie();
caricaImgProdotto();
//初始化ViewPager并设置适配器
pager=(ViewPager)findViewById(R.id.pager);
setAdapter(新的SampleFragmentPagerAdapter(getSupportFragmentManager(),category));
//将选项卡绑定到ViewPager
tabs=(PagerSlidingTabStrip)findViewById(R.id.tabs);
tabs.setViewPager(寻呼机);
setDimensioniSchermo();
伊扎帕吉纳();
}
私有无效creaCategorie(){
categorie=新字符串[dati.optJSONArray(“categorie”).length();
对于(inth=0;h
如何从我的
SampleFragmentPagerAdapter
调用方法
getSecondScrollView
? 我用这个: 我需要片段内部的方法来获取外部视图
对不起,我的英语不好,我是意大利人:D

尝试使用callbacklistener,使
Pagina
实现一个接口,例如
PagerAdapterListener
,该接口具有方法
onGetSecondScrollView()
,如下:

public interface PagerAdapterListener {
   void onGetSecondScrollView(String str);
}
public class Pagina extends Fragment implements PagerAdapterListener {

    @Override
    public void onGetSecondScrollView(String str) {
        getSecondScrollView(str);
    }
}
然后将
PagerAdapterListener
添加到
Adapter
的构造函数中,以便
Adapter
具有
PagerAdapterListener
类型的变量(
new SampleFragmentPagerAdapter(…,…,this)
)。当您需要调用
getSecondScrollView()
方法时,只需调用接口上的
onGetSecondScrollView()
方法(实际上是您的
片段

当然,不要忘记实现PagerAdapterListener及其onGetSecondScrollView()方法,如下所示:

public interface PagerAdapterListener {
   void onGetSecondScrollView(String str);
}
public class Pagina extends Fragment implements PagerAdapterListener {

    @Override
    public void onGetSecondScrollView(String str) {
        getSecondScrollView(str);
    }
}

在有权访问ViewPager的活动中使用以下代码:

 Pagina  fragment = (Pagina ) getSupportFragmentManager()
                  .findFragmentByTag( makeFragmentName(pager.getId(),page_index_of_pagina_fragment_inViewPager));
然后调用
fragment.getSecondScrollView(“str”)

这是从适配器获取片段名称的
makeFragmentName
方法:

 private  String makeFragmentName(int viewPagerId, int index) {
      return "android:switcher:" + viewPagerId + ":" + index;
  }

注意调用必须在片段完全加载后完成

您需要为调用该方法创建接口您是否在viewPager中使用该片段?请,错误消息如何?是的,通过此操作显示您使用SampleFragmentPagerAdaptererror的代码:无法解析方法getChildFragmentManager()我在片段内部使用了use getFragmentManager()或geSupportFragmentManager()运行时错误:尝试在null对象referencegetCurrentItem()上调用虚拟方法“void layout.Pagina.getSecondScrollView(java.lang.String)”我的意思是pagina片段的索引,您应该在查看页面中使用pagina片段的索引。如果我设置0或1,则错误相同。这可能是因为片段尚未加载?我不明白您所说的“然后将PagerAdapterListener添加到适配器的构造函数中,以便适配器具有PagerAdapterListener类型的变量(new SampleFragmentPagerAdapter(…,…,this))”是什么意思向PagerAdapterListener类型的适配器(接口)添加一个变量,在创建适配器时,通过其构造函数将实现接口的片段实例提供给适配器(您的构造函数将类似于:SampleFragmentPagerAdapter(var1,var2,this);