Как реализовать панель инструментов Android на панели инструментов

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

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 или нет.

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

Ответ 1

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

сначала разбиваем абстрактный класс 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 Now в вашей активности, когда вы нажмете дисплей назад-значок, если это необходимо. ваш OnBackPressed должен быть примерно таким:

 int backStackCount = getSupportFragmentManager().getBackStackEntryCount();

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

                getSupportFragmentManager().popBackStack();
}

См. полную реализацию здесь.

Ответ 2

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

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

Ответ 3

Предполагается, что вы используете 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);
    }

Ответ 4

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

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

Ответ 5

Он работает с нажатой клавишей на панели инструментов

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();

}

});

}

Ответ 6

У меня есть Основная деятельность и Четыре фрагмента. В MainActivity я пишу этот код

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    toolbar.setNavigationOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            onBackPressed();

        }
    });

это работает нормально, и если у вас есть фрагменты, создайте метод onBackPressed()

@Override
public void onBackPressed() {
    int position = mViewPager.getCurrentItem();
    if(position == 2) { // go back to search / result tab from info detail tab
        mViewPager.setCurrentItem(2);
    } else if(position == 0) { // switch from result to search tab or go back to home tab
        SectionsPagerAdapter sectionsPagerAdapter = (SectionsPagerAdapter) mViewPager.getAdapter();
        Fragment fragment = sectionsPagerAdapter.getItem(position);
        if(fragment instanceof ResultFragment) {
            Bundle bundle = ((ResultFragment) fragment).getArguments();
            if(bundle != null) {
                sectionsPagerAdapter.replaceFragment(SearchFragment.newInstance(bundle.getString(GlobalInfo.TAG_ID), bundle.getString(GlobalInfo.PART_NO), bundle.getString(GlobalInfo.SERIAL_NO), bundle.getString(GlobalInfo.PART_NAME)), getString(R.string.search), 0);
            }
        } else {
            mViewPager.setCurrentItem(1);
        }
    }
    else if(position == 3){
        SectionsPagerAdapter sectionsPagerAdapter = (SectionsPagerAdapter) mViewPager.getAdapter();
        Fragment fragment = new ToolMgtFragment();
        sectionsPagerAdapter.replaceFragment(fragment,"Tool Mgt", 3);
    }
    else {
        super.onBackPressed();
    }
}