2013-11-15 42 views
14

我使用的例子給出在以下鏈接片段已激活 - 當試圖setArguments

http://android-er.blogspot.in/2013/04/handle-onlistitemclick-of-listfragment.html

這裏,我已經擴展列表片段和其他片段擴展兩個類之一。 現在我傳遞的對象以這種方式detailfragment:

* 從ListFragment *

@Override 
    public void onListItemClick(ListView l, View v, int position, long id) { 
     Detailfragment detailFragment = (Detailfragment)getFragmentManager().findFragmentById(detailFragmentID); 

     Bundle bundle = new Bundle(); 
     bundle.putSerializable(BUNDLE_KEY, obj);// passing this object 

     detailFragment.setArguments(bundle); 
     detailFragment.setUpLayout();// update the UI 
} 
片段類我收到

現在,基本目標是更新片段的UI根據列表中的片段選擇的項目,這就是原因我發送對象

Bundle b = getArguments(); 
b.getSerializable(BUNDLE_KEY); 

現在在項目選擇它說:「片段已經激活」 。

這裏有什麼問題?我究竟做錯了什麼?

回答

11

從官方Android開發參考:

公共無效setArguments(捆綁參數)供應結構參數對該片段。這隻能在片段附加到其活動之前調用;也就是說,您應該在構建片段後立即調用它。這裏提供的參數將在片段銷燬和創建時保留。

您的片段已經連接到其活性 我建議你用你自己的方法,你不需要setArguments!

片段類中創建自己的setUIArguments(捆綁參數)和更新這個方法裏面的片段UI

你會調用這個方法是這樣的:

@Override 
    public void onListItemClick(ListView l, View v, int position, long id) { 
     Detailfragment detailFragment = (Detailfragment)getFragmentManager().findFragmentById(detailFragmentID); 

     Bundle bundle = new Bundle(); 
     bundle.putSerializable(BUNDLE_KEY, obj);// passing this object 

     detailFragment.setUIArguments(bundle); /* your new method */ 
} 

在你的片段類

public void setUIArguments(Bundle args) { 
    getActivity().runOnUiThread(new Runnable() { 
     public void run() { 
      /* do your UI stuffs */ 
     } 
    } 
} 
+0

我的課在像這個類DetailFragment擴展FragmentActivity和裏面,我有擴展片段的內部類,現在我怎麼能調用這個方法? – Goofy

+0

並且我還需要上下文或DetailFragment類中的這個內容,您能不能幫我解決這個問題 – Goofy

18

另一種解決方法是爲您的片段創建一個空的構造函數。

public Detailfragment() { 
    super(); 
    // Just to be an empty Bundle. You can use this later with getArguments().set... 
    setArguments(new Bundle()); 
} 

,並在onListItemClick方法您使用捆綁:

@Override 
public void onListItemClick(ListView l, View v, int position, long id) { 
    Detailfragment detailFragment = (Detailfragment)getFragmentManager().findFragmentById(detailFragmentID); 

    // Update the keys. 
    detailFragment.getArguments().putSerializable(BUNDLE_KEY, obj);// passing this object 

    detailFragment.setUpLayout();// update the UI 
} 

現在你可以調用getArguments()methond在setUpLayout()方法。

+0

這實際上是一個好主意,我用它的突變來解決問題。 此外,這應該被設置爲正確的答案,因爲解決方案圍繞getArguments()及其操作 - 不同於第一個答案,這是一個解決方法,不適合所有*場景。 – HBN

+1

我沒有看到'''Fragment''有一個名爲'''setupLayout()的方法''' –

0

這一個全局變量:

private FragmentManager fragmentmanager; 
private FragmentTransaction fragmenttransaction; 

這些代碼放到你的 「名單片段」 的onCreate()活動時間:

fragmenttransaction = fragmentmanager.beginTransaction(); 
fragmenttransaction.replace(detailFragmentID, detailFragment, "test"); 
fragmenttransaction.addToBackStack(null); 
fragmenttransaction.commit(); 

這些是Drawerlistitem單擊事件:

@Override 
    public void onListItemClick(ListView l, View v, int position, long id) { 

    Bundle bundle = new Bundle(); 
    fragmenttransaction = fragmentmanager.beginTransaction(); 

     if(fragmentmanager.findFragmentById("test") != null) { 
      fragmenttransaction.remove(fragmentmanager.findFragmentByTag("test")); 
     }  

    Detailfragment detailFragment = (Detailfragment)getFragmentManager().findFragmentById(detailFragmentID); 

     bundle.putSerializable(BUNDLE_KEY, obj);// passing this object 

     detailFragment.setArguments(bundle); 
     fragmenttransaction.replace(detailFragmentID, detailFragment, "test"); 
     fragmenttransaction.addToBackStack(null); 
     fragmenttransaction.commit();  
} 

現在擴展片段代碼,因爲它是:

Bundle b = getArguments(); 
b.getSerializable(BUNDLE_KEY); 
0

對話片段的公共方法

public void setBundle(final Bundle bundle) { 
     final Bundle arguments = getArguments(); 
     arguments.clear(); 
     arguments.putAll(bundle); 
    } 

顯示或更新對話片段

public void showMessageDialogue(final String tag, final Bundle bundle) { 
     final Fragment fragment = mFragmentManager.findFragmentByTag(tag); 
     if (fragment != null && fragment instanceof MessageDialogueFragment) { 
      ((MessageDialogueFragment) fragment).setBundle(bundle); 
     } else { 
      final MessageDialogueFragment messageDialogueFragment = new MessageDialogueFragment(); 
      messageDialogueFragment.setArguments(bundle); 
      messageDialogueFragment.show(mFragmentManager, tag); 
     } 
    } 
9

您可以檢查是否已經有爭論,如果是的話只需添加/更新它們。

private static void initFrag(Fragment frag, Bundle args) { 
    if (frag.getArguments() == null) { 
     frag.setArguments(args); 
    } else { 
     //Consider explicitly clearing arguments here 
     frag.getArguments().putAll(args); 
    } 
} 

(可選)如果不能安全地假定已存在的參數仍然有效,則可能需要清除現有參數。

相關問題