0

Я хотел бы реализовать прорисовывающиеся виды в своих фрагментах Шерлока с помощью меню ящика. Я сделал это, и все работает отлично, но есть незначительная проблема, которую я не могу понять.Android: Меню ящика + swipeView

Итак, давайте начнем с некоторых СТОМН моего кода:

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; 
} 

} 

Ok, ящик работает отлично, и если я нажимаю на «титул тест» он раздуть макет с прикосновением и я могу видеть изображение в 2 просмотра проведите пальцем. Но если я открою задний ящик и снова коснусь «тестового названия», я могу увидеть проецируемые изображения без изображений на моем макете фрагмента салфетки. Если я поставлю устройство в альбомной ориентации и вернусь к портрету, изображение на моих фрагментах салфетки вернется! открыть ящик -> снова нажать на название теста -> изображения исчезнут .... -> ландшафтный дизайн -> портрет -> изображение назад.

Определенные макеты являются стандартными для ящиков и салфеток. внутри макета фрагментов swipeviews есть только изображение. Таким образом, проблема должна быть в java-части, но я не могу понять, где. Любые помогает?

ответ

0

Попробуйте следующее: TestAdapter должен реализовать FragmentStatePagerAdapter вместо FragmentsPagerAdapter. Причина в том, что метод getItem() вызывается по-разному. У меня такая же проблема. Надеюсь это поможет.

+0

Попробуйте «это» ... Что такое «это»? – ST3

+0

Я имею в виду попробовать эту вещь: TestAdapter должен реализовывать фрагментарный файл-файл вместо fragmentspageradapter.Причина в том, что метод getItem() называется differntly. У меня такая же проблема. Надеюсь это поможет. – PaSapps

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; 
} 

Теперь она работает с меню Ящика + swipeView.

Вы можете скачать мою измененную версию от here.

Смежные вопросы