我想使用抽屉菜单实现对我的Sherlock片段的滑动视图。 我做到了,似乎工作正常,但是,有一个小问题,我无法弄清楚。
所以让我们从代码的一些方面开始:
MainActivity
public class MainActivity extends SherlockFragmentActivity {
// Declare Variable
DrawerLayout mDrawerLayout;
ListView mDrawerList;
ActionBarDrawerToggle mDrawerToggle;
MenuListAdapter mMenuAdapter;
String[] title;
String[] subtitle;
int[] icon;
Fragment fragment1 = new TestFragment();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.drawer_main);
// Generate title
title = new String[] { "Test title" };
// Generate subtitle
subtitle = new String[] { "Test subtitle" };
// Generate icon
icon = new int[] { R.drawable.action_about };
// Locate DrawerLayout in drawer_main.xml
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
// Locate ListView in drawer_main.xml
mDrawerList = (ListView) findViewById(R.id.left_drawer);
// Set a custom shadow that overlays the main content when the drawer
// opens
mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow,
GravityCompat.START);
// Pass results to MenuListAdapter Class
mMenuAdapter = new MenuListAdapter(this, title, subtitle, icon);
// Set the MenuListAdapter to the ListView
mDrawerList.setAdapter(mMenuAdapter);
// Capture button clicks on side menu
mDrawerList.setOnItemClickListener(new DrawerItemClickListener());
// Enable ActionBar app icon to behave as action to toggle nav drawer
getSupportActionBar().setHomeButtonEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
// ActionBarDrawerToggle ties together the the proper interactions
// between the sliding drawer and the action bar app icon
mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
R.drawable.ic_drawer, R.string.drawer_open,
R.string.drawer_close) {
public void onDrawerClosed(View view) {
// TODO Auto-generated method stub
super.onDrawerClosed(view);
}
public void onDrawerOpened(View drawerView) {
// TODO Auto-generated method stub
super.onDrawerOpened(drawerView);
}
};
mDrawerLayout.setDrawerListener(mDrawerToggle);
if (savedInstanceState == null) {
selectItem(0);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getSupportMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
if (mDrawerLayout.isDrawerOpen(mDrawerList)) {
mDrawerLayout.closeDrawer(mDrawerList);
} else {
mDrawerLayout.openDrawer(mDrawerList);
}
}
return super.onOptionsItemSelected(item);
}
// The click listener for ListView in the navigation drawer
private class DrawerItemClickListener implements
ListView.OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
selectItem(position);
}
}
private void selectItem(int position) {
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
// Locate Position
switch (position) {
case 0:
ft.replace(R.id.content_frame, fragment1);
break;
ft.commit();
mDrawerList.setItemChecked(position, true);
// Close drawer
mDrawerLayout.closeDrawer(mDrawerList);
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
// Sync the toggle state after onRestoreInstanceState has occurred.
mDrawerToggle.syncState();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Pass any configuration change to the drawer toggles
mDrawerToggle.onConfigurationChanged(newConfig);
}
}
TestFragment:
public class TestFragment extends SherlockFragment {
ViewPager mViewPager;
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.test, container, false);
mViewPager = (ViewPager) rootView.findViewById(R.id.viewpager);
PagerTabStrip pagerTabStrip = (PagerTabStrip) rootView.findViewById(R.id.pagerTabStrip);
testAdapter titleAdapter = new testAdapter(getFragmentManager());
mViewPager.setAdapter(titleAdapter);
mViewPager.setCurrentItem(0);
return rootView;
}
}
testAdapter
public class testAdapter extends FragmentPagerAdapter {
private String titles[] = new String[]{"View1","View2"};
private Fragment frags[] = new Fragment[titles.length];
public systemAdapter(FragmentManager fm) {
super(fm);
frags[0] = new testSwipe1();
frags[1] = new testSwipe2();
}
@Override
public CharSequence getPageTitle (int position){
Log.v("TitleAdapter - getPageTitle=", titles[position]);
return titles[position];
}
@Override
public Fragment getItem(int position) {
Log.v("TitleAdapter - getItem=", String.valueOf(position));
return frags[position];
}
@Override
public int getCount() {
return frags.length;
}
testSwipe1和testSwipe2相同:
public class testSwipe1 extends SherlockFragment {
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.testswipe_layout, container, false);
ImageButton testImage = (ImageButton) rootView.findViewById(R.id.test);
//todo function image
return rootView;
}
}
好的,抽屉工作正常,如果我点击“测试标题”,它会通过滑动来扩大布局,我可以在2个测试滑动视图中看到图像。 Owever,如果我打开抽屉并再次点击“测试标题”,我可以看到滑动视图,而我的滑动片段布局上没有图像。如果我将设备置于横向并回到肖像,我的滑动片段上的图像会回来!打开抽屉 - &gt;再次点击测试标题 - &gt;图像消失.... - &gt;园艺师 - &gt;肖像 - &gt;图像回来了。
定义的布局是抽屉和滑动视图的标准。在swipeviews片段布局中,只有一个imageview。所以问题必须在java部分,但我无法弄清楚在哪里。 有帮助吗?
答案 0 :(得分:0)
试试这个:TestAdapter应该实现FragmentStatePagerAdapter而不是FragmentsPagerAdapter。原因是方法getItem()被不同地调用。我有同样的问题。希望这会有所帮助。
答案 1 :(得分:0)
我已经编辑了here中提供的代码。
我只是通过使用asyDrawerLayout.java
接口的方法来更改OnGestureListener
文件。
在onCreate()
中,我通过添加以下行将手势设置为当前上下文。
gd = new GestureDetector(this, this);
然后我按以下方式覆盖onTouchEvent()
@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
//Registering TouchEvent with GestureDetector
return gd.onTouchEvent(event);
}
然后我更改了onFling()
如下
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
//Defining Sensitivity
float sensitivity = 30;
//Swipe Left Check
if(e1.getX() - e2.getX() > sensitivity && mOpen){
closeDrawer();
return true;
}
//Swipe Right Check
if(e2.getX() - e1.getX() > sensitivity && !mOpen){
openDrawer();
return true;
}
return true;
}
现在正在使用Drawer菜单+ swipeView。
您可以从here下载我编辑过的版本。