我已经阅读了很多很好的信息,并取得了很好的进展,但现在我陷入困境。我目前状态下的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) {
}
}
}