2016-05-19 3 views
14

Я использую пользовательскую панель инструментов. Мне нужно добавить к нему кнопку «Назад». Теперь я использую этот код, чтобы добавить кнопку «Назад».Как реализовать панель инструментов андроида Назад

Toolbar toolbar = (Toolbar) getActivity().findViewById(R.id.toolbar); 
     toolbar.setBackgroundColor(getResources().getColor(R.color.white)); 
     toolbar.setNavigationIcon(getResources().getDrawable(R.drawable.back_arrow)); 
     toolbar.setNavigationOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       onBackPressed(); 
      } 
     }); 

Это прекрасно работает. Я вижу, что добавлена ​​кнопка «Назад». Но рассмотрим случай, когда я нахожусь в Fragment1, у которого нет кнопки возврата. Теперь я перехожу к Fragment2 и добавляю кнопку «Назад». Из фрагмента 2 открываю Фрагмент 3 и снова добавляю кнопку «Назад».

Теперь, когда я нажимаю кнопку от фрагмента 3, чтобы вернуться к фрагменту 2, я должен проверить стек фрагмента, чтобы увидеть, нужна ли кнопка возврата во фрагменте 2 или нет.

Есть ли какой-либо другой способ автоматической обработки кнопки возврата, когда мы нажимаем фрагменты на стек?

+0

Можете ли вы сделать меня более ясно, что вы точно хотите? – Masum

+0

обновил мой вопрос – Zach

ответ

0

Вы можете легко обращаться с иконкой назад. Если все ваши фрагмента находятся в одной активности я очень рекомендую обращаться с этим с следующим образом:

первой клетью абстрактной класс BaseFragment которые реализуют FragmentManager .OnBackStackChangedListener затем положить следующий метод в том, что:

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     mainActivity = (MainActivity) getActivity(); 

     getFragmentManager().addOnBackStackChangedListener(this); 

     shouldDisplayHomeUp(); 
    } 

    @Override 
    public void onBackStackChanged() { 
     shouldDisplayHomeUp(); 
    } 


    public boolean shouldDisplayHomeUp() { 
     //Enable Up button only if there are entries in the back stack 
     boolean canBack = false; 
     try { 
      canBack = getFragmentManager().getBackStackEntryCount() > 0; 
     } catch (Exception ex) { 
//   Log.e(getClass().getCanonicalName(), ex.getMessage());getMessage 
     } 

     if (canBack) { 
      mainActivity.drawerDisable(); 
     } else { 
      mainActivity.drawerEnable(); 
     } 
     return canBack; 
    } 

По этому пути disableDrawer & enableDrawer функция обрабатывает вашу иконку и метод OnBackPressed обрабатывает ваш BackStack Теперь, когда вы нажмете обратно значок, если необходимо. Ваш onBackPressed должно быть что-то вроде этого:

int backStackCount = getSupportFragmentManager().getBackStackEntryCount(); 

      if (backStackCount == 0) { 
       //nothing exist in backStack OS handle it 
       super.onBackPressed(); 
      } else { 

       getSupportFragmentManager().popBackStack(); 
} 

Посмотреть полную реализацию here.

+0

Спасибо за ваш ответ. Вы знаете, почему onBackStackChanged вызывается несколько раз, когда фрагмент удаляется из стека? – Zach

+0

Я думаю, что это связано с ** BackStack ** push/pop Но я не уверен. – Amir

7

Это предполагает, что вы используете AppCompatActivity

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

     toolbar = (Toolbar) findViewById(R.id.tool_bar); // Attaching the layout to the toolbar object 
     setSupportActionBar(toolbar); 

     // enabling action bar app icon and behaving it as toggle button 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
     getSupportActionBar().setHomeButtonEnabled(true); 
    } 

Тогда в onOptionsItemSelected вы можете изменить кнопку домой следующим образом:

@Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_settings) { 
      return true; 
     } 
     else if(id == android.R.id.home){ 
      Intent i= new Intent(this, MainActivity.class); 
      i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); 
      startActivity(i); 
      finish(); 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 
10

Просто добавьте две новые строки кода. Что-то вроде этого

Toolbar toolbar = (Toolbar) getActivity().findViewById(R.id.toolbar); 
toolbar.setBackgroundColor(getResources().getColor(R.color.white)); 
toolbar.setNavigationIcon(getResources().getDrawable(R.drawable.back_arrow)); 

setSupportActionBar(toolbar); 
getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

toolbar.setNavigationOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     onBackPressed(); 
    } 
}); 
0

использование метода в классе вашей деятельности

private void setupToolbar(){ 
    Toolbar toolbar=(Toolbar)findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 
     ActionBar actionBar=getSupportActionBar(); 
     actionBar.setDisplayHomeAsUpEnabled(true); 
     actionBar.setDisplayShowHomeEnabled(true); 
     toolbar.setNavigationOnClickListener(new View.OnClickListener() { 
    @Override 
      public void onClick(View v) { 
      finish(); 
      } 
       }); 
       } 
+0

Хотя ответ может быть только кода, лучше немного объяснить, что вы сделали, это добавит ценность вашему ответу и в будущем. – DaFois

0

работы Это на спине нажимается функции на панель

private setUpToolBar() { 

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 

setSupportActionBar(toolbar); 

getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

getSupportActionBar().setDisplayShowHomeEnabled(true); 

toolbar.setNavigationOnClickListener(new View.OnClickListener() { 

@Override 

public void onClick(View v) { 

onBackPressed(); 

} 

}); 

} 
+0

Правильно отредактируйте свой код и добавьте некоторое объяснение. – Billa