2013-01-11 16 views
1

我已经阅读了很多很好的信息,并取得了很好的进展,但现在我陷入困境。我目前状态下的Android项目由一个ViewPager组成,其中两个导航选项卡由Action Bar Sherlock构建。一个选项卡是一个ListFragment,另一个选项卡目前只是一个用于测试目的的片段。我想用与ListFragment相同的容器中的细节片段替换ListFragment,而不是打开新的活动。我能做到这一点,利用本次论坛提出了一个布局(没有的FrameLayout包装我不能让细节加载):这两个碎片都可以在ViewPager中看到

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:fadingEdge="none" > 
    <FrameLayout 
     android:id="@+id/main_container" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" > 
     <android.support.v4.view.ViewPager 
      android:id="@+id/pager" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" /> 
    </FrameLayout> 

</RelativeLayout> 

我用一个回调的主要活动是点击一个列表项目时。

从ListFragment:

@Override 
public void onListItemClick(ListView l, View v, int position, long id) { 
    mCallback.onItemSelected(position);  
} 

,并在主活动:

public void onItemSelected(int position) {  

    TestDetailsFragment newFragment = new TestDetailsFragment(); 
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 

    ft.replace(R.id.main_container, newFragment); 
    ft.addToBackStack(null); 
    ft.commit();   
} 

最后,我TestDetailsFragment:

public class TestDetailsFragment extends SherlockFragment { 

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

    View view = inflater.inflate(R.layout.test_layout, container, false); 
    return view; 
} 

}

我的问题是, L当细节片段被加载时,istFragment仍然可见。如果我按下“返回”,详细信息文字将消失。如果我不回推,但滑动到我的其他片段,细节文本仍然存在。我想如果我可以改变ft.replace(R.id.main_container,newFragment);ft.replace(R.id。ViewPager的containerId页面,newFragment)它会工作,但我无法弄清楚如何做到这一点,尽管很多搜索。我尝试用以下方式替换列表布局,这也无效(错误:未找到* my_list_layout *的视图):ft.replace(R.id.my_list_layout,newFragment);下面是ListFragment布局XML:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/my_list_layout" 
android:orientation="vertical" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent"> 

<ListView android:id="@android:id/list" 
    android:layout_height="wrap_content" 
    android:layout_width="fill_parent" /> 

的任何建议非常感谢。

我真的很新(这是我在这里的第一篇文章),所以我会继续前进,并将我的整个主要活动放在这里,以防万一我错过了一些非常明显的东西。谢谢!

import java.util.ArrayList; 

import android.content.Context; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentStatePagerAdapter; 
import android.support.v4.app.FragmentTransaction; 
import android.support.v4.view.PagerAdapter; 
import android.support.v4.view.ViewPager; 
import android.util.Log; 

import com.actionbarsherlock.app.ActionBar; 
import com.actionbarsherlock.app.ActionBar.Tab; 
import com.actionbarsherlock.app.SherlockFragmentActivity; 

public class MainActivity extends SherlockFragmentActivity 
     implements MyListFragment.OnItemSelectedListener { 

ViewPager mViewPager; 
TabsAdapter mTabsAdapter; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setTitle(R.string.app_name); 

    setContentView(R.layout.main); 
    ViewPager mViewPager = (ViewPager)findViewById(R.id.pager); 

    final ActionBar actionBar = getSupportActionBar(); 
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
    actionBar.setDisplayShowTitleEnabled(true); 
    actionBar.setHomeButtonEnabled(true); 
    actionBar.setIcon(R.drawable.ic_title); 

    mTabsAdapter = new TabsAdapter(this, mViewPager); 
    mTabsAdapter.addTab(actionBar.newTab().setText("tab1"), MyFragment.class, null); 
    mTabsAdapter.addTab(actionBar.newTab().setText("tab2"), MyListFragment.class, null); 
    if (savedInstanceState != null) { 
     actionBar.setSelectedNavigationItem(savedInstanceState.getInt("tab", 0)); 
    }   
} 

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putInt("tab", getSupportActionBar().getSelectedNavigationIndex()); 
} 

public void onItemSelected(int position) {  

    TestDetailsFragment newFragment = new TestDetailsFragment(); 
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
    ft.replace(R.id.main_container, newFragment); 
    ft.addToBackStack(null); 
    ft.commit();   
} 

public static class TabsAdapter extends FragmentStatePagerAdapter 
    implements ActionBar.TabListener, ViewPager.OnPageChangeListener { 

    private final Context mContext; 
    private final ActionBar mActionBar; 
    private final ViewPager mViewPager; 
    private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>(); 


    static final class TabInfo { 
     private final Class<?> clss; 
     private final Bundle args; 

     TabInfo(Class<?> _class, Bundle _args) { 
      clss = _class; 
      args = _args; 
     } 
    } 

    public TabsAdapter(SherlockFragmentActivity activity, ViewPager pager) { 
     super(activity.getSupportFragmentManager()); 
     mContext = activity; 
     mActionBar = activity.getSupportActionBar(); 
     mViewPager = pager; 
     mViewPager.setAdapter(this); 
     mViewPager.setOnPageChangeListener(this); 
    } 

    public void addTab(ActionBar.Tab tab, Class<?> clss, Bundle args) { 
     TabInfo info = new TabInfo(clss, args); 
     tab.setTag(info); 
     tab.setTabListener(this); 
     mTabs.add(info); 
     mActionBar.addTab(tab); 
     notifyDataSetChanged(); 
    } 

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

    @Override 
    public Fragment getItem(int position) { 
     TabInfo info = mTabs.get(position); 
     return Fragment.instantiate(mContext, info.clss.getName(), info.args); 
    } 

    @Override 
    public void onPageScrolled(int position, float positionOffset, 
      int positionOffsetPixels) { 
    } 

    @Override 
    public void onPageSelected (int position) { 
     mActionBar.setSelectedNavigationItem(position); 
    } 

    @Override 
    public void onPageScrollStateChanged(int state) {   
    } 

    @Override 
    public int getItemPosition(Object object) { 
     return PagerAdapter.POSITION_NONE; 
    } 

    @Override 
    public void onTabSelected(Tab tab, FragmentTransaction ft) { 
     Object tag = tab.getTag(); 
     for (int i=0; i<mTabs.size(); i++) { 
      if (mTabs.get(i) == tag) { 
       mViewPager.setCurrentItem(i); 
      } 
     } 

    } 

    @Override 
    public void onTabUnselected (Tab tab, FragmentTransaction ft) { 

    } 

    @Override 
    public void onTabReselected (Tab tab, FragmentTransaction ft) { 

    } 
} 
} 

回答

1

My problem is that the ListFragment remains visible when the details fragment is loaded

即正常作为用于替换它们之间的片段代码把新的详细信息片段,其中还包含FrameLayoutViewPager(与相应的ListFragment),它不会被删除。

I think if I could change the ft.replace(R.id.main_container, newFragment); to ft.replace(R.id.containerId of ViewPager page, newFragment) it would work, but I cannot figure out how to do that despite much searching.

是的,这是一个选项。我建议您使用新嵌套的Fragments API(可用于兼容性包或正常的Fragments,API 16+)。如果你想只需更换ListFragment用新的细节Fragment(所以你保持这种的刷卡它的ViewPager +的能力额外Fragment),那么这样做:

  • ,你目前使用的ListFragment你会把一个简单的包装Fragment(其作为布局简单FrameLayout),该ViewPager的其他Fragment将保持不变
  • 在开始在包装Fragment使用getChildFragmentManager()添加正常ListFragment
  • 使包装器片段实现您的回调接口。为了得到一个参考家长Fragment您可以在ListFragment使用getParentFragment()方法和施放此为您的听众在包装Fragment将实施,对于使用FrameLayout细节Fragment更换ListFragment回调

如果你想详细Fragment更换ViewPager(与它的两个片段一起),然后修改Activity的布局只具有FrameLayout到您将添加无论是Fragment含有ViewPager或详情Fragment