2012-08-07 38 views
0

我有一個ListFragment,它爲其元素提供了一個ContextMenu。當我把這個片段放入xml-layout時,一切正常,但是當我通過FragmentManager以編程的方式添加這個ListFragment時,這隻能工作到第一次屏幕旋轉。旋轉屏幕後,我可以在Android的復古ListFragment並創建由於當編程添加片段時,ContextMenu不起作用

CustomListFragment fragment = new CustomListFragment(); 
fragmentTransaction.add(R.id.customFragmentContainer, fragment); 

,其中新ListFragment被創建一個新的調試器看到的。當我長按一個項目打開ContextMenu時,新的ListFragment的onCreateContextMenu方法被調用並且結果被傳遞給舊的ListFragment的onContextItemSelected方法。

我覺得它變得更清晰,當我張貼一些代碼:

這裏是我的ListFragment:

public class CustomListFragment extends ListFragment { 

private LayoutInflater layoutInflater; 
private OnSelectedListener<String> selectionListener; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    layoutInflater = inflater; 
    return inflater.inflate(R.layout.list_fragment_layout, null); 
} 

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    setListAdapter(new CustomListAdapter()); 
    registerForContextMenu(getListView()); 
} 

public void setOnSelectedListener(OnSelectedListener<String> listener) { 
    selectionListener = listener; 
} 

private static final String item0 = "item0"; 
private static final String item1 = "item1"; 

@Override 
public void onCreateContextMenu (ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { 
    menu.add(0, 0, 0, item0); 
    menu.add(0, 1, 0, item1); 
} 
@Override 
public boolean onContextItemSelected(MenuItem menuItem) { 
    String selection; 
    if (menuItem.getItemId()==0) 
     selection = item0; 
    else 
     selection = item1; 

    if (selectionListener!=null) 
     selectionListener.onSelected(selection); 
    return true; 
} 

private class CustomListAdapter extends BaseAdapter { 

    private List<String> elemente = new ArrayList<String>(); 

    public CustomListAdapter() { 
     elemente.add("one"); 
     elemente.add("two"); 
     elemente.add("three"); 
    } 

    @Override 
    public int getCount() { 
     return elemente.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return elemente.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return 0; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     if (convertView==null) 
      convertView = layoutInflater.inflate(R.layout.element, null); 
     TextView tv = (TextView)convertView; 
     tv.setText(elemente.get(position)); 
     return tv; 
    } 
} 
} 

有了這個活動它正常工作:

public class CustomFragmentActivity extends FragmentActivity implements OnSelectedListener<String> { 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.fragment_layout); 

    FragmentManager fragmentManager = getSupportFragmentManager(); 
    CustomListFragment fragment = (CustomListFragment)fragmentManager.findFragmentById(R.id.customFragment); 

    fragment.setOnSelectedListener(this); 
} 

@Override 
public void onSelected(String selection) { 
    Toast.makeText(this, selection, Toast.LENGTH_LONG).show(); 
} 
} 

但與此活動它僅在第一個屏幕旋轉之前起作用:

public class CustomFragmentContainerActivity extends FragmentActivity implements OnSelectedListener<String> { 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.fragment_container_layout); 

    FragmentManager fragmentManager = getSupportFragmentManager(); 
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
    CustomListFragment fragment = new CustomListFragment(); 
    fragmentTransaction.add(R.id.customFragmentContainer, fragment); 
    fragmentTransaction.commit(); 

    fragment.setOnSelectedListener(this); 
} 

@Override 
public void onSelected(String selection) { 
    Toast.makeText(this, selection, Toast.LENGTH_LONG).show(); 
} 
} 

OnSelectedListener只是提供一種公共方法的接口。在屏幕旋轉後,結果(所選項目)被傳遞給舊的ListFragment。但是這個舊的ListFragment是由Android系統重新創建的,而selectionListener爲null,所以沒有任何反應。界面看起來像這樣:

public interface OnSelectedListener<V> { 
    public void onSelected(V selection); 
} 

最後,也許我應該提到我使用的是v4支持庫。

回答

0

好的,問題是,支持庫中存在內存泄漏,並且調用了舊片段的onContextItemSelected()方法。當我返回true時,更新的片段不會接收此方法調用。

相關問題