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