2016-04-19 7 views
0

У меня есть макет ящика, который должен иметь два вида навигации в нем, потому что есть пара опций, которые нужно выровнять сверху, а другая внизу, с разделителем разделяя их.Ящик с двумя видами навигации и выбранными цветами тонов

Мне удалось заставить его работать, но теперь у меня есть две разные проблемы с моей настройкой.

1) Первый, я не могу изменить цвет текста выбранных элементов (цвет фона работает как intented через селектор ящика, но по какой-то причине, цвет текста выбранного элемента всегда colorPrimary)

2) Второй сложнее, так как есть два вида навигации, может случиться так, что в первом и втором случае есть выбранная строка, даже если все они выполняют загрузку фрагментов в одном контейнере. Есть ли способ управлять этим, когда выбран элемент для первого вида навигации, выбранный элемент второго навигационного представления отменяется?

Это расположение кассет:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v4.widget.DrawerLayout 
    android:id="@+id/drawer_layout" 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_height="match_parent" 
    android:layout_width="match_parent" 
    xmlns:app="http://schemas.android.com/apk/res-auto"> 



    <!-- 1º Layout de la activity --> 
    <include layout="@layout/activity_main"/> 

    <!-- 2º Layout del drawer --> 

    <android.support.design.widget.NavigationView 
     android:id="@+id/container_navigation" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:layout_gravity="start" 
     app:itemBackground="@drawable/drawer_list_selector" 
     android:nestedScrollingEnabled="true" 
     android:scrollIndicators="none"> 

     <RelativeLayout 
      android:layout_width="match_parent" 
      android:layout_height="match_parent"> 

      <View 
       android:layout_width="match_parent" 
       android:layout_height="@dimen/divider_height" 
       android:background="@color/colorAccent" 
       android:layout_above="@+id/navigation_view" 
       android:id="@+id/top_separator"/> 

      <android.support.design.widget.NavigationView 
       android:id="@+id/navigation_view" 
       android:layout_width="wrap_content" 
       android:layout_height="match_parent" 
       android:layout_gravity="start" 
       android:layout_above="@+id/bottom_separator" 
       app:itemBackground="@drawable/drawer_list_selector" 
       app:menu="@menu/menu_navigation" /> 

      <View 
       android:layout_width="match_parent" 
       android:layout_height="@dimen/divider_height" 
       android:background="@color/colorAccent" 
       android:layout_above="@+id/navigation_bottom" 
       android:id="@+id/bottom_separator"/> 
      <android.support.design.widget.NavigationView 
       android:id="@+id/navigation_bottom" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       app:menu="@menu/menu_navigation_bottom" 
       app:itemBackground="@drawable/drawer_list_selector" 
       android:layout_alignParentBottom="true"/> 
     </RelativeLayout> 
    </android.support.design.widget.NavigationView> 
</android.support.v4.widget.DrawerLayout> 

Это расположение верхнего навигационного по:

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto"> 

     <group android:checkableBehavior="single"> 
      <item 
       android:id="@+id/nav_tus_ofertas" 
       android:title="@string/tus_ofertas" 
       android:icon="@drawable/ic_offer" /> 

      <item 
       android:id="@+id/nav_movimiento_puntos" 
       android:title="@string/movimiento_puntos" 
       android:icon="@drawable/ic_points"/> 

      <item 
       android:id="@+id/nav_asociaciones" 
       android:title="@string/asociaciones" 
       android:icon="@drawable/ic_flag"/> 

     </group> 
</menu> 

макет вида снизу навигационного по:

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android"> 
    <group android:checkableBehavior="single"> 
     <item 
      android:id="@+id/nav_terminos" 
      android:title="@string/terminos" 
      android:icon="@drawable/ic_document" /> 

     <item 
      android:id="@+id/nav_contacto" 
      android:title="@string/contacto" 
      android:icon="@drawable/ic_email"/> 
     <item 
      android:id="@+id/nav_valorar" 
      android:title="@string/valorar" 
      android:icon="@drawable/ic_rate_review"/> 
     <item 
      android:id="@+id/nav_exit" 
      android:title="@string/exit" 
      android:icon="@drawable/ic_shutdown"/> 
    </group> 
</menu> 

селектор фона выбранного элемента:

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_pressed="true" android:drawable="@color/colorAccent" /> 
    <item android:state_activated="true" android:drawable="@color/colorAccent" /> 
    <item android:state_selected="true" android:drawable="@color/colorAccent" /> 
    <item android:state_checked="true" android:drawable="@color/colorAccent" /> 
    <item android:state_pressed="false" android:drawable="@android:color/transparent" /> 
    <item android:state_activated="false" android:drawable="@android:color/transparent" /> 
    <item android:state_selected="false" android:drawable="@android:color/transparent" /> 
    <item android:state_checked="false" android:drawable="@android:color/transparent" /> 
</selector> 

Деятельность, которая вызывает ящик и обрабатывает события:

public class MainActivity extends AppCompatActivity { 

    @Bind(R.id.toolbar) Toolbar toolbar; 
    @Bind(R.id.tabs) TabLayout tabs; 
    @Bind(R.id.drawer_layout) DrawerLayout drawerLayout; 
    @Bind(R.id.container_navigation) NavigationView containerNavigator; 
    @Bind(R.id.navigation_view) NavigationView navigationView; 
    @Bind(R.id.navigation_bottom) NavigationView navigationBottom; 
    @Bind(R.id.vsFooter) ViewStubCompat stub; 

    ImageView userPicture; 
    TextView userMail; 

    ViewPager viewPager; 
    Menu menu; 
    ActionBar actionBar; 
    ViewPagerFragment viewPagerFragment; 
    Usuario currentUser; 

    public Usuario getCurrentUser() { 
     return currentUser; 
    } 

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

     ButterKnife.bind(this); 
     currentUser = UserApiManager.getInstance(getApplicationContext()).getCurrentUser(); 

     viewPagerFragment = ViewPagerFragment.newInstance(); 
     setupToolbar(); 
     setupNavigationDrawer(); 

     ApiManager.getInstance(getApplicationContext()).setupFooter(stub, currentUser.getIdLocalidad(), this); 
     getSupportFragmentManager().beginTransaction().replace(R.id.frame_layout,viewPagerFragment).commit(); 

    } 

    public void setupViewPager(ViewPager viewPager) { 
     tabs.setupWithViewPager(viewPager); 
    } 

    private void setupToolbar() { 

     setSupportActionBar(toolbar); 
     actionBar = getSupportActionBar(); 
     if (actionBar!=null){ 
      actionBar.setDisplayHomeAsUpEnabled(true); 
      actionBar.setHomeAsUpIndicator(R.drawable.ic_menu_black); 
      actionBar.setTitle(getString(R.string.app_title)); 

     } 
    } 

    private void setupNavigationDrawer() { 

     View headerView = navigationView.inflateHeaderView(R.layout.navigation_header); 
     userPicture = (ImageView) headerView.findViewById(R.id.user_picture); 
     userMail = (TextView) headerView.findViewById(R.id.user_mail); 

     userMail.setText(currentUser.getEmail()); 
     Picasso.with(this).load(currentUser.getImagenURL()).transform(new CircleTransformation()).into(userPicture); 
     navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { 
      @Override 
      public boolean onNavigationItemSelected(MenuItem item) { 
       switch (item.getItemId()) { 
        case R.id.nav_tus_ofertas: 
         showTabLayout(); 
         actionBar.setTitle(getString(R.string.app_title)); 
         getSupportFragmentManager().beginTransaction().replace(R.id.frame_layout,viewPagerFragment).commit(); 
         break; 
        case R.id.nav_movimiento_puntos: 
         hideTabLayout(); 
         Bundle bundle = new Bundle(); 
         bundle.putString("idcliente", currentUser.getId()); 
         MovimientoPuntosFragment movimientoPuntosFragment = MovimientoPuntosFragment.newInstance(); 
         movimientoPuntosFragment.setArguments(bundle); 
         actionBar.setTitle(getString(R.string.movimiento_puntos)); 
         getSupportFragmentManager().beginTransaction().replace(R.id.frame_layout, movimientoPuntosFragment).commit(); 
         break; 
        case R.id.nav_asociaciones: 
         hideTabLayout(); 
         actionBar.setTitle(getString(R.string.asociaciones)); 
         getSupportFragmentManager().beginTransaction().replace(R.id.frame_layout, AsociacionFragment.newInstance()).commit(); 
         break; 
       } 
       drawerLayout.closeDrawers(); 
       return true; 
      } 
     }); 
     navigationBottom.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { 
      @Override 
      public boolean onNavigationItemSelected(MenuItem item) { 
       switch (item.getItemId()) { 

        case R.id.nav_terminos: 
         hideTabLayout(); 
         actionBar.setTitle(getString(R.string.terminos)); 
         getSupportFragmentManager().beginTransaction().replace(R.id.frame_layout, LegalesFragment.newInstance()).commit(); 

         break; 
        case R.id.nav_contacto: 
         Intent intent = new Intent(Intent.ACTION_VIEW); 
         Uri data = Uri.parse("mailto:?subject=" + getString(R.string.contacto_email)); 
         intent.setData(data); 
         startActivity(intent); 
         break; 
        case R.id.nav_valorar: 
         final String appPackageName = BuildConfig.APPLICATION_ID; 
         try { 
          Log.i("url", "market://details?id=" + appPackageName); 
          startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + appPackageName))); 
         } catch (android.content.ActivityNotFoundException anfe) { 
          startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + appPackageName))); 
         } 
         break; 
        case R.id.nav_exit: 
         break; 
       } 
       drawerLayout.closeDrawers(); 
       return true; 
      } 

     }); 

    } 

     @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 

     getMenuInflater().inflate(R.menu.menu_over, menu); 
     this.menu = menu; 

     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 

     switch (item.getItemId()) { 
      case android.R.id.home: 
       drawerLayout.openDrawer(GravityCompat.START); 
       break; 
      case R.id.action_user: 
       Intent intent = new Intent(this, PerfilUsuarioActivity.class); 
       startActivity(intent); 
       break; 
     } 

     return super.onOptionsItemSelected(item); 
    } 

    public void hideTabLayout(){ 
     tabs.setVisibility(View.GONE); 

    } 

    public void showTabLayout(){ 
     tabs.setVisibility(View.VISIBLE); 
    } 


} 

Любая помощь будет оценен по достоинству! Спасибо заранее!

ответ

0

Решенный! Проблема с цветом Я решил его с помощью селектора, он не работал раньше, потому что у меня была синтаксическая ошибка (тег селектора внутри основного тега селектора).

Это код выбора цвета в:

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
     <item android:color="#FFFFFFFF" android:state_checked="true" /> 
     <item android:color="#E6000000" android:state_checked="false"/> 
</selector> 

Вторая проблема, которую я решил ее программно отменив элементы другого navigationview в onNavigationItemSelected.

Это функция, которую я называю:

public void deselectItems(NavigationView view){ 
    int size = view.getMenu().size(); 
    for (int i = 0; i < size; i++) { 
     view.getMenu().getItem(i).setChecked(false); 
    } 
} 

Я знаю, что должен быть лучший способ решить вторую проблему, но это один работал.