2015-12-08 154 views
1

我正在开发一个自助服务终端应用,人们可以步行去订购东西。通过活动访问片段方法

我有一堆不同的片段(订单,审查,支付等)的单一活动。一些互相替换,一些被添加。该活动有一个硬编码的片段R.id.fragmentContainer,其余的以编程方式添加和标记。

现在我想要的是在我的活动中有一个函数调用片段的元素之一(请看updateReceivedData()),但由于某种原因我无法这样做,并且我得到cannot resolve method adjustPriceFunc

我添加了代码,所以有人可以告诉我我做错了什么。该应用程序通常会与某些硬件进行通信,因此我从代码中提取了一些细节以便于阅读。

public class MainActivity extends FragmentActivity { 
private final String TAG = MainActivity.class.getSimpleName(); 

List<WeakReference<Fragment>> fragList = new ArrayList<WeakReference<Fragment>>(); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    Log.d(TAG, "onCreate()"); 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.backbone); 
    android.support.v4.app.FragmentManager fm = getSupportFragmentManager(); 
    android.support.v4.app.Fragment fragment = fm.findFragmentById(R.id.fragmentContainer); 

    if (fragment == null) { 
     fragment = new Fragment(); 
     fm.beginTransaction() 
       .add(R.id.fragmentContainer, fragment, "SystemDownFragment") 
       .addToBackStack(null) 
       .commit(); 
    } 
} 

public void orderFunc() { 
    Log.d(TAG, "orderFunc()"); 
    if(sendingLogFlag)  attemptSend(TAG + ":orderFunc()"); 

    for(int i = 0; i < getActiveFragments().size(); i++) { 
     getSupportFragmentManager().beginTransaction().remove(getActiveFragments().get(i)).commit(); 
    } 

    Fragment newFragment = new Fragment(); 
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
    ft.add(R.id.fragmentContainer, newFragment, "OrderFragment"); 
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
    ft.commit(); 
} 

public void checkoutFunc() { 
    Log.d(TAG, "checkoutFunc()"); 
    if(sendingLogFlag)  attemptSend(TAG + ":checkoutFunc()"); 

    for(int i = 0; i < getActiveFragments().size(); i++) { 
     getSupportFragmentManager().beginTransaction().remove(getActiveFragments().get(i)).commit(); 
    } 

    Fragment newFragment = new Fragment(); 
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
    ft.add(R.id.fragmentContainer, newFragment, "CheckOutFragment"); 
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
    ft.commit(); 
} 

public void reviewFunc(){ 
    Log.d(TAG, "reviewFunc()"); 
    if(sendingLogFlag)  attemptSend(TAG + ":reviewFunc()"); 

    if(getActiveFragments().size() > 1){ 
     Fragment frag = getSupportFragmentManager().findFragmentByTag("ReviewFragment"); 
     FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
     ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE); 
     ft.remove(frag); 
     ft.commit(); 
    } 
    else { 
     Fragment newFragment = new Fragment(); 
     FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
     ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
     ft.add(R.id.fragmentContainer, newFragment, "ReviewFragment"); 
     ft.commit(); 
    } 
    getSupportFragmentManager().executePendingTransactions(); 
} 

public void payFunc(boolean enabled){ 
    Log.d(TAG, "payFunc()"); 
    if(sendingLogFlag)  attemptSend(TAG + ":payFunc()"); 

    if(!enabled){ 
     Fragment frag = getSupportFragmentManager().findFragmentByTag("PayFragment"); 
     FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
     ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE); 
     ft.remove(frag); 
     ft.commit(); 
    } 
    else { 
     Fragment newFragment = new Fragment(); 
     FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
     ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
     ft.add(R.id.fragmentContainer, newFragment, "PayFragment"); 
     ft.commit(); 
    } 
    getSupportFragmentManager().executePendingTransactions(); 
} 

public void doneFunc() { 
    Log.d(TAG, "doneFunc()"); 

    for(int i = 0; i < getActiveFragments().size(); i++) { 
     getSupportFragmentManager().beginTransaction().remove(getActiveFragments().get(i)).commit(); 
    } 

    Fragment newFragment = new Fragment(); 
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
    ft.add(R.id.fragmentContainer, newFragment, "StartupFragment"); 
    ft.commit(); 
} 

@Override 
public void onAttachFragment (Fragment fragment) { 
    fragList.add(new WeakReference(fragment)); 
} 

public List<Fragment> getActiveFragments() { 
    ArrayList<Fragment> ret = new ArrayList<Fragment>(); 
    for(WeakReference<Fragment> ref : fragList) { 
     Fragment f = ref.get(); 
     if(f != null) { 
      if(f.isVisible()) { 
       ret.add(f); 
      } 
     } 
    } 
    return ret; 
} 

private void updateReceivedData() { 
    Fragment frag = getSupportFragmentManager().findFragmentByTag("PayFragment"); 
         frag.adjustPriceFunc(); 
} 

回答

2

您正在尝试使用方法adjustPriceFunc()Fragment类,这是不是它的一部分。

使用此代码,其中MyFragment是你的正确片段(我认为它应该是PayFragment)。

private void updateReceivedData() { 
    Fragment frag = getSupportFragmentManager().findFragmentByTag("PayFragment"); 
    if (frag instanceof MyFragment) { 
     frag.adjustPriceFunc(); 
    }     
} 
+0

这并获得成功。谢谢 –

0

即使它是WeakReference,存储对片段的引用也是一种不好的做法。
更好地利用这种方式:

Fragment fragment = getSupportFragmentManager().findFragmentByTag("tag"); 
2

这里有一些错误代码

  • orderFunccheckoutFunc等添加remove的交易,并在循环后调用commit一次,像

    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 
    for(int i = 0; i < getActiveFragments().size(); i++) { 
        transaction.remove(getActiveFragments().get(i)); 
    } 
    transaction.commit(); 
    
  • 在中得到编译错误,因为Fragment没有adjustPriceFunc()方法。您需要用(清洁方法)创建接口adjustPriceFunc()方法,让你的片段执行它,然后你updateReceivedData看起来像如下:

    private void updateReceivedData() { 
        InterfaceWithAdjustPriceMethod frag = (InterfaceWithAdjustPriceMethod) getSupportFragmentManager().findFragmentByTag("PayFragment"); 
        frag.adjustPriceFunc(); 
    } 
    
+0

呵呵,我完全没有抓住前面的错误。感谢您指出 –