Возврат в главную активность

217
13 мая 2019, 18:40

Имеется следующая проблема: при возврате из одной активности в другую, мне необходимо, чтобы открывался определенный пункт меню главной активности. То есть:

После нажатия на название в определенном разделе меню открывается активность. А когда нажимаю "Вверх", необходимо, чтобы возвращалось именно в тот же раздел меню ( в данном случае 4), а не в первый. Реализовывал это как только мог, но все равно выкидывает в первый элемент. Пытаюсь обрабатывать как нажатие кнопки "Назад", т.е.

@Override
    public boolean onOptionsItemSelected(MenuItem item){
        switch (item.getItemId()){
            case R.id.home:
                this.finish();
                return true;
                default:
                    return super.onOptionsItemSelected(item);
        }
    }

Но все равно не помогает. В чем ошибка и как исправить?

UPD

MainActivity

package asus.example.com.fitnessapp;
import android.support.annotation.NonNull;
import android.support.design.widget.BottomNavigationView;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MenuItem;
import android.widget.FrameLayout;
public class MainActivity extends AppCompatActivity implements BottomNavigationView.OnNavigationItemSelectedListener {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        BottomNavigationView bottomNavigationView = findViewById(R.id.bottomNav);
        bottomNavigationView.setOnNavigationItemSelectedListener(this);
        FrameLayout container = (FrameLayout) findViewById(R.id.container);
        Fragment fragment = new ProgramsFragment();
        FragmentTransaction fragmentTransaction;
        fragmentTransaction = getSupportFragmentManager().beginTransaction();
        fragmentTransaction.replace(R.id.container, fragment);
        fragmentTransaction.addToBackStack(null);
        fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
        fragmentTransaction.commit();
    }

    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        Fragment fragment;
        FragmentTransaction ft;
        switch (item.getItemId()) {
            case R.id.programs:
                fragment = new ProgramsFragment();
                break;
            case R.id.indications:
                fragment = new IndicationsFragment();
                break;
            case R.id.calculator:
                fragment = new CalculatorFragment();
                break;
            case R.id.articles:
                fragment = new ArticlesFragment();
                break;
            default:
                return super.onOptionsItemSelected(item);
        }
        ft = getSupportFragmentManager().beginTransaction();
        ft.replace(R.id.container, fragment);
        ft.addToBackStack(null);
        ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
        ft.commit();
        return true;
    }
}

ArticlesFragment

package asus.example.com.fitnessapp;

import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.GridView;

/**
 * A simple {@link Fragment} subclass.
 */
public class ArticlesFragment extends Fragment {
    private final String article = "ARTICLE";
    private final String[] articlesNames = { "10 ways to keep your body fit", "How to make simple exercises for beginners?", "Which gymnastic complexes are suitable for adults?",
            "How to lift socks on training apparatus?", "How to recover yourself after the training?", "How to recover yourself at night?"};
    public ArticlesFragment() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_articles, container, false);
        GridView countriesList = (GridView) view.findViewById(R.id.gridView);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, articlesNames);
        countriesList.setAdapter(adapter);
        AdapterView.OnItemClickListener itemClickListener = new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Intent intent = new Intent(getActivity(), ArticleActivity.class);
                switch (position){
                    case 0:
                        intent.putExtra(article,"ten_ways");
                        break;
                    case 1:
                        intent.putExtra(article,"how_to_make");
                        break;
                    case 2:
                        intent.putExtra(article,"for_adults");
                        break;
                    case 3:
                        intent.putExtra(article,"lifting_socks");
                        break;
                    case 4:
                        intent.putExtra(article,"recovering");
                        break;
                    case 5:
                        intent.putExtra(article,"sleeping");
                        break;
                    default:
                        break;
                }
                startActivity(intent);
            }
        };
        countriesList.setOnItemClickListener(itemClickListener);
        return view;
    }
}

ArticleActivity

package asus.example.com.fitnessapp;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MenuItem;
import android.widget.TextView;
import java.io.IOException;
import java.io.InputStream;
public class ArticleActivity extends AppCompatActivity {
    private TextView textView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_article);
        ActionBar actionBar = getSupportActionBar();
        if (actionBar != null) {
            actionBar.setHomeButtonEnabled(true);
            actionBar.setDisplayHomeAsUpEnabled(true);
        }
        String article = "ARTICLE";
        String path = getIntent().getStringExtra(article);
        textView = (TextView) findViewById(R.id.article);
        readFromFile(path);
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item){
        switch (item.getItemId()){
            case R.id.home:
                this.finish();
                return true;
                default:
                    return super.onOptionsItemSelected(item);
        }
    }
    private void readFromFile(String path){
        byte[] buffer = null;
        InputStream is;
        try {
            is = getAssets().open(path);
            int size = is.available();
            buffer = new byte[size];
            is.read(buffer);
            is.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        String data = new String(buffer);
        textView.setText(data);
    }
}

MainActivity - это активность, на которой есть ActionBar, BottomNavigationView и по умолчанию добавляется ProgramsFragment. При нажатии на элемент Articles, ProgramsFragment замещается ArticlesFragment'ом. А ArticlesActivity - активность, которая открывается при нажатии на название статьи, которая содержит содержание статьи

Answer 1

В общем проблема оказалась в методе ArticleActivity. Достаточно заменить R.id.home на android.R.id.home

@Override
    public boolean onOptionsItemSelected(MenuItem item){
        switch (item.getItemId()){
            case android.R.id.home:
                this.finish();
                return true;
                default:
                    return super.onOptionsItemSelected(item);
        }
    }

Дело в том, что R.id.home != android.R.id.home поэтому происходил вызов блока default. Не знаю точно почему, но стандартное поведение кнопки назад в ActionBar создает новый экземпляр MainActivity, при чём значение savedInstance = null. Т.е. происходило поведение, будто активность была полностью выгружена из памяти.

Изменив значение на android.R.id.home мы возвращаемся в предыдущую активность, так же как и по нажатию на физическую кнопку назад смартфона.

P.S. Постараюсь найти объяснение такому странному на мой взгляд поведению ActionBar и отписаться здесь же.

READ ALSO
byte array в string как &ldquo;0&rdquo; и &ldquo;1&rdquo;

byte array в string как “0” и “1”

Как преобразовать массив битов в текстовый вид так, чтобы это выглядело как набор из 0 и 1?

203
JAVA, maven, servlet [закрыт]

JAVA, maven, servlet [закрыт]

Зачем нужен maven, когда работаем с сервлетами?

217