2013-12-18 5 views
0

지난 며칠 동안 인터넷 검색 및 소잉에 대한 많은 예제와 설명을 마친 후에도 얻을 수없는 기본적인 질문이 하나 있습니다.활동이있는 탐색 서랍 - 기본 개념

5 가지 Activity가 있습니다. 각 활동은 다른 활동과 독립적이며 각 활동에는 자체 레이아웃 파일이 있습니다. 이제 Navigation Drawer를 App 메뉴로 추가하고 싶습니다. 내가 이해

, 2 권장 방법은 다음과 같습니다

1) 하나 MainActivity에 그 5 개 활동을 병합하고, 5 가지 레이아웃을로드 5 개 조각을 사용합니다. 하지만 그 5를 1로 병합하는 것이 어려울 것입니다. 하나의 활동에 모든 메소드가로드 된 경우 성능 문제가 발생하지 않습니까?

2) BaseActivity가 포함 된 서랍 하나를 가지고 다른 모든 활동을 기본 활동으로 확장합니다. 하지만 모든 내 활동이 NavDrawer 클래스 (서랍 포함)로 확장되었지만 작동하지 않습니다. 개별 서랍이 잘 작동합니다 (NavDrawer 만 실행할 때). 내 기존 활동의 레이아웃 XML을 변경해야합니까?

이것은 매우 기본적인 것이지만 미안하지만 2 일 후에 개념을 보류하지 못하면 게시합니다.

원하는 경우 내 코드를 첨부 할 수 있지만 서랍 코드는 기본적으로 튜토리얼에 따라 다릅니다.

감사합니다,

참조 내가 사용하고 :
1) http://developer.android.com/training/implementing-navigation/nav-drawer.html 2) http://www.androidhive.info/2013/11/android-sliding-menu-using-navigation-drawer/

+0

는 어떻게 5 개 활동을로드하는? 아니면 5 조각? 문제는 탐색 서랍을 사용하면 단편을 사용하고 fragment.replace 메소드를 사용하면 현재 단편을 파괴하고 해당 단편에 새 단편을 적용한다는 것입니다. –

+0

오케이, 그래서 나는 현재 코드를 다시 작성하여 5 개의 Activity 클래스를 하나로 변환 한 다음 탐색 서랍을 추가해야합니까? (현재 내 앱에는 서랍이 없습니다.) – abdfahim

+0

만약 당신이 안드로이드 하이브 링크를 따라한다면 그것은 당신에게 가장 좋을 것입니다 ... 나를 믿으세요 :) –

답변

1

난 당신이 actionbar tabsViewPager를 사용하는 것이 좋습니다 수 있습니다. 뷰 페이지 (viewpager)의 도움을 받아 5 개의 모든 조각에서 동일한 탐색 경로가 표시됩니다. 효율성에 오면, ViewPager은 항상 다음 페이지와 이전 페이지도 준비하는 것 외에도 현재 페이지를 만듭니다. 사용자가 페이지를 스 와이프하는 동안 내용을 조금 더 빨리 볼 수 있습니다. 나는 항상 같은 것을 따르고 그것이 비효율적이라고 생각하지 않는다. 내 응용 프로그램 중 하나의

코드는 다음과 같습니다 :

public class MainActivity extends ActionBarActivity { 


    String[] titles; 

    ViewPager viewPager; 
    private DrawerLayout mDrawerLayout; 
    private ListView mDrawerList; 
    private ActionBarDrawerToggle mDrawerToggle; 

    private CharSequence mDrawerTitle; 
    private CharSequence mTitle; 
    private String[] mListTitles; 

    public PagerTabStrip titleStrip; 


     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.main); 

      viewPager = (ViewPager) findViewById(R.id.pager); 

      TitleAdapter titleAdapter = new TitleAdapter(getSupportFragmentManager()); 
      viewPager.setAdapter(titleAdapter); 
      viewPager.setCurrentItem(0); 

      mTitle = mDrawerTitle = getTitle(); 
      mListTitles = getResources().getStringArray(R.array.drawerlist_array); 
      mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
      mDrawerList = (ListView) findViewById(R.id.left_drawer); 

      mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START); 
      // sets up the drawer's list view with items and click listener 
      mDrawerList.setAdapter(new ArrayAdapter<String>(this, R.layout.drawer_list_item, mListTitles)); 
      mDrawerList.setOnItemClickListener(new DrawerItemClickListener()); 

      // enables ActionBar app icon to behave as action to toggle nav drawer 
      getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
      getSupportActionBar().setHomeButtonEnabled(true); 


      mDrawerToggle = new ActionBarDrawerToggle(this, /* host Activity */ 
      mDrawerLayout, /* DrawerLayout object */ 
      R.drawable.ic_drawer, /* nav drawer image to replace 'Up' caret */ 
      R.string.drawer_open, /* "open drawer" description for accessibility */ 
      R.string.drawer_close /* "close drawer" description for accessibility */ 
      ) 
      { 
       public void onDrawerClosed(View view) 
       { 
        getSupportActionBar().setTitle(mTitle); 

       } 

       public void onDrawerOpened(View drawerView) 
       { 
        getSupportActionBar().setTitle(mDrawerTitle); 

       } 
      }; 
      mDrawerLayout.setDrawerListener(mDrawerToggle); 

      if (savedInstanceState == null) 
      { 
       selectItem(0); 
      } 


     } 

     @Override 
     public boolean onCreateOptionsMenu(Menu menu) { 

      getMenuInflater().inflate(R.menu.main, menu); 
      return true; 
     } 

     @Override 
     public boolean onPrepareOptionsMenu(Menu menu) 
     { 

      boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList); 
      return super.onPrepareOptionsMenu(menu); 
     } 

     @Override 
     public boolean onOptionsItemSelected(MenuItem item) 
     { 
      // The action bar home/up action should open or close the drawer. 
      // ActionBarDrawerToggle will take care of this. 
      if (mDrawerToggle.onOptionsItemSelected(item)) 
      { 
       return true; 
      } 
      else{ 

       return false; 
      } 
     } 


     class TitleAdapter extends FragmentPagerAdapter{ 
      private String titles[] = new String[]{"Expenses","Savings","Income"}; 
      private Fragment frags[] = new Fragment[titles.length]; 

      public TitleAdapter(FragmentManager fm) { 
        super(fm); 
        frags[0] = new Fragment1(); 
        frags[1] = new Fragment2(); 
        frags[2] = new Fragment3(); 
      } 

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

    } 



     /* The click listner 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) 
     { 

      // update selected item and title, then close the drawer 
      mDrawerList.setItemChecked(position, true); 
      setTitle(mListTitles[position]); 
      mDrawerLayout.closeDrawer(mDrawerList); 
     } 

     @Override 
     public void setTitle(CharSequence title) 
     { 
      mTitle = title; 
      getSupportActionBar().setTitle(mTitle); 
     } 

     /** 
     * When using the ActionBarDrawerToggle, you must call it during 
     * onPostCreate() and onConfigurationChanged()... 
     */ 

     @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 toggls 
      mDrawerToggle.onConfigurationChanged(newConfig); 
     } 


    } 
+0

안녕하세요, 당신의 예를 들어 주셔서 감사합니다. 안드로이드 코딩에 대한 나의 미숙함 때문에, 나는 여전히 한 가지를 가질 수 없다. MainActivity에 모든 코드를 병합해야합니까? 내 다른 응용 프로그램 페이지 (예 : "레코드 추가"페이지, "레코드 편집"페이지, "레코드 표시"페이지, "설정"페이지 등 다른 Java 레이아웃을 다른 쌍을 다른 레이아웃을로드 할 조각을 사용합니까? 내 액티비티를 프래그먼트로 변환하는 데 문제가있다. (액티비티 대신 프래그먼트로 확장하면 많은 메소드가 작동하지 않는다.) – abdfahim

+0

모든 코드를 주 활동으로 병합 할 필요가 없다. 필자의 예제를 관찰 할 수 있다면, 귀하의 경우 그것은 5 조각입니다. 그래서 각 조각에서 당신이 자신의 레이아웃을 가지고, 한 페이지 추가 설정, 한 페이지 설정. 편집 레코드를오고, 당신은 쇼 레코드 페이지에서만 편집 기능을 제공해야합니다. 완전히 다른 활동을로드하여 편집하고 저장하십시오. googleplay 앱 등의 일부 앱을 확인하는 것이 좋습니다. – Kanth

+0

괜찮습니다 ...마지막 질문 하나 .. 조각을 통해 레이아웃 edit_record.xml을로드한다고 가정 해 보겠습니다. 이제 edit_record.java 파일에 Activity 형태로 작성한 해당 페이지의 기능을 어떻게 추가 할 수 있습니까? 이제 Iam은 조언을 위해 참조 용으로 일부 앱을 확인합니다. – abdfahim