0

我試圖從我的片段更新我的視圖尋呼機指示器。 我的問題是該項目的結構是這樣的: MainActivity - > FragmentA - > FragmentStatePagerAdapter - > FragmentProduct從片段更新視圖尋呼機指示器

我試圖實現在適配器的接口,但該適配器無法趕上的情況下,只主動活動正在趕上事件。 所以我唯一想要它是從片段更新視圖分頁器(FragmentStatePagerAdapter)。

MainActivity:

public class ProductDetailActivity extends ActivityBase implements ProductFragment.OnFragmentInteractionListener, TabIndicatorListener { 


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


@Override 
public void onFragmentInteraction(Uri uri) { 

} 

@Override 
public void updateTabIndicator(ProductFragment productFragment) { 
} } 

** FragmentA - 設置適配器等等等等**

public class ProductFragmentDetails extends FragmentBase { 

private NavigationHelper navHelper = NavigationHelper.getInstance(); 

ViewPager viewPager; 
PagerAdapter adapter; 

TabPageIndicator indicator; 

List<ProductPagerAdapter.RegisterValue> prices; 
private FragmentManager fm; 

ProductPagerAdapter pagerUpdater; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    createDummyPrices(); 

    View mainView = inflater.inflate(R.layout.fragment_product_details, container); 
    viewPager = (ViewPager) mainView.findViewById(R.id.pager); 

    viewPager.setVisibility(View.VISIBLE); 
    indicator = (TabPageIndicator) mainView.findViewById(R.id.indicator); 

    fm = getActivity().getSupportFragmentManager(); 
    adapter = new ProductPagerAdapter(fm, getActivity().getApplicationContext(), indicator, prices); 
    viewPager.setAdapter(adapter); 

    indicator.setViewPager(viewPager); 
    indicator.setVisibility(View.VISIBLE); 


    return mainView; 
}} 

FragmentStateAdapter

public class ProductPagerAdapter extends FragmentStatePagerAdapter implements IconPagerAdapter, TabIndicatorListener { 

... init vars etc etc 

@Override 
public void startUpdate(ViewGroup container) { 
    super.startUpdate(container); 
} 

@Override 
public Object instantiateItem(ViewGroup container, int position) { 
    Fragment fragment = (Fragment) super.instantiateItem(container, position); 
    registeredFragments.put(position, fragment); 
    return fragment; 
} 

@Override 
public CharSequence getPageTitle(int position) { 
    return Integer.toString(position + 1); 
} 

@Override 
public void destroyItem(ViewGroup container, int position, Object object) { 
    super.destroyItem(container, position, object); 
} 

@Override 
public void setPrimaryItem(ViewGroup container, int position, Object object) {  super.setPrimaryItem(container, position, object); 
} 

@Override 
public void finishUpdate(ViewGroup container) { 
    super.finishUpdate(container); 
} 

@Override 
public boolean isViewFromObject(View view, Object object) { 
    return super.isViewFromObject(view, object); 
} 

@Override 
public Parcelable saveState() { 
    return super.saveState(); 
} 

@Override 
public void restoreState(Parcelable state, ClassLoader loader) { 
    super.restoreState(state, loader); 
} 

/** 
* Get icon representing the page at {@code index} in the adapter. 
* 
* @param index 
*/ 
@Override 
public int getIconResId(int index) { 
    return prices.get(index).icon; 
} 

@Override 
public int getCount() { 
    return prices.size(); //The number of items in the pagerAdapter must be equal to number of products 
} 

// Instantiate the fragment to display for that page 
@Override 
public Fragment getItem(int position) { 
    String productPrice = Double.toString(prices.get(position).price); 
    return ProductFragment.newInstance(productPrice, "OBS"); 
} 

@Override 
public void updateTabIndicator(ProductFragment productFragment) { 
} 

FragmentProduct

public class ProductFragment extends FragmentBase { 
init some vars and fields.... 

    Context context; 
TabIndicatorListener tabIndicatorListener; 

public static ProductFragment newInstance(String price, String observations) { 
    ProductFragment fragment = new ProductFragment(); 
    Bundle args = new Bundle(); 
    args.putString(ARG_PRICE, price); 
    args.putString(ARG_OBSERVATIONS, observations); 
    fragment.setArguments(args); 
    return fragment; 
} 


public ProductFragment() { 
    // Required empty public constructor 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    context = getActivity(); 
    if (getArguments() != null) { 
     mParamPrice = getArguments().getString(ARG_PRICE); 
     mParamObservation = getArguments().getString(ARG_OBSERVATIONS); 
    } 

    try { 
     tabIndicatorListener = (TabIndicatorListener) getActivity(); 
    } catch (ClassCastException e) { 
     throw new ClassCastException(getActivity().toString() 
       + " must implement TabIndicatorListener"); 
    } 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 

    View productView = inflater.inflate(R.layout.fragment_product, container, false); 

    initViews(productView); //Its initialized the views.. 

    btnAbsent.setOnClickListener(clickOnBtnAbsent); 
    btnValidate.setOnClickListener(clickOnBtnValidate); 

    editTxtPrice.setText(String.valueOf(mParamPrice)); 

    return productView; 
} 

/** 
* @param productView 
*/ 
private void initViews(View productView) { 
    txtViewProductName = (TextView) productView.findViewById(R.id.txtViewNameProduct); 
    txtViewPrice = (TextView) productView.findViewById(R.id.txtViewPrice); 
    } 

@Override 
protected int getActionBarMenuRes() { 
    return 0; 
} 

@Override 
protected int getMainLayoutRes() { 
    return 0; 
} 

public void onButtonPressed(Uri uri) { 
    if (mListener != null) { 
     mListener.onFragmentInteraction(uri); 
    } 
} 


public View.OnClickListener clickOnBtnAbsent = new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     tabIndicatorListener.updateTabIndicator(ProductFragment.this); 
       //Here is where i want to update my view pager indicator 
     } 
}; 

@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 
    try { 
     mListener = (OnFragmentInteractionListener) activity; 
    } catch (ClassCastException e) { 
     throw new ClassCastException(activity.toString() 
       + " must implement OnFragmentInteractionListener"); 
    } 
} 

@Override 
public void onDetach() { 
    super.onDetach(); 
    mListener = null; 
} 


     public interface OnFragmentInteractionListener { 
      public void onFragmentInteraction(Uri uri); 
     } 

回答

1

首先我很驚訝,你沒有遇到由於您使用的FragmentManager問題。相反的:

fm = getActivity().getSupportFragmentManager(); 

你應該使用專用的FragmentManager嵌套片段:

fm = getChildFragmentManager(); 

其次,與聽者的目標,你可以使用的,getParentFragment()的片段類的方法之一。該方法返回時,嵌套片段,容器片段:

// in ProductFragment 
@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 
    mListener = ((ProductFragmentDetails) getParentFragment()).getListener(); 
} 

在ProductFragmentDetails你就會有方法:

public (OnFragmentInteractionListener) getListener() { 
    return (OnFragmentInteractionListener) adapter; 
} 
+0

是的是我的錯誤,我忘記改變fragmentManager,我'也吃了一驚這是如何工作的。好吧,現在我明白了,但我懷疑,因爲我將在父代片段(女巫生成適配器),而不是在「FragmentStatePagerAdapter」,我可以更新指標,我可以調用getListener中的接口要在適配器中捕捉,還是建議另一種方式?我將嘗試更新適配器並以此方法重新發送。預先感謝您 – firetrap 2015-02-09 21:05:17

+0

@firetrap也許我的代碼不清楚。創建ProductFragment時,它將通過getParentFragment()訪問其父(ProductFragmentDetails),並通過getListener()來請求實現TabIndicatorListener接口來發布更改指示符事件。 ProductFragmentDetails具有該接口的實現,它是實現接口的適配器(ProductPagerAdapter)。因此,當您在父片段上調用getListener()時,您將獲得處理更改的適配器引用。 – Luksprog 2015-02-09 21:14:54

相關問題