навигация вверх по панели действий от фрагмента B к фрагменту A

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

При нажатии на один из пунктов меню открывается первый фрагмент с видом Recycler/Card. При нажатии на одну из карт открывается новый фрагмент с более подробной информацией о выбранных картах.

Теперь проблема заключается в том, что фрагмент подробностей показывает значок дома, потому что я включаю setDisplayHomeAsUpEnabled (true), но когда я нажимаю стрелку назад, он ничего не делает. Аппаратная кнопка «Назад» возвращает меня к предыдущему фрагменту (Recycler/Card View). У меня также есть setHasOptionsMenu(true) в подробном фрагменте. Я везде ставлю теги журнала, чтобы увидеть, когда кнопка «Домой» реагирует, но ничего.

Надеюсь, кто-нибудь может дать мне руку.

Деятельность:

public class AppStart extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {

ActionBarDrawerToggle actionBarDrawerToggle;
final String TAG = "AppSart: onBackPressed";
final String TAG1 = "AppSart: resetActionBar";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_app_start);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
}

@Override
public void onBackPressed() {
    int stack = getSupportFragmentManager().getBackStackEntryCount();
    Log.d(TAG,Integer.toString(stack));
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    return super.onCreateOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    return false;
}

public void resetActionBar(boolean childAction)
{
    Log.d(TAG1,Boolean.toString(childAction));
    if (childAction) {
        actionBarDrawerToggle.setDrawerIndicatorEnabled(false);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    } else {
        getSupportActionBar().setDisplayHomeAsUpEnabled(false);
        actionBarDrawerToggle.setDrawerIndicatorEnabled(true);
    }
}
}

Фрагмент переработчика:

public class ProductFragment extends Fragment {

final String TAG1 = "ProdFrag: onCreate";
final String TAG2 = "ProdFrag: onCreateView";
final String TAG3 = "ProdFrag: onResume";
final String TAG6 = "ProdFrag: ActionSetting";
final String TAG7 = "ProdFrag: home";

public ProductFragment() {
    // Required empty public constructor
}

@Override
public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
    int stack = getActivity().getSupportFragmentManager().getBackStackEntryCount();
    Log.d(TAG1,Integer.toString(stack));
    boolean canback = stack>0;
    ((AppStart)getActivity()).resetActionBar(canback);
}

@Override
public void onResume() {
    super.onResume();
    int stack = getActivity().getSupportFragmentManager().getBackStackEntryCount();
    Log.d(TAG3,Integer.toString(stack));
    boolean canback = stack>0;
    ((AppStart)getActivity()).resetActionBar(canback);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view=inflater.inflate(R.layout.fragment_product,container,false);        
    int stack = getActivity().getSupportFragmentManager().getBackStackEntryCount();
    Log.d(TAG2,Integer.toString(stack));
    return view;
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    // Inflate the menu; this adds items to the action bar if it is present.
    inflater.inflate(R.menu.toolbar_menu, menu);
    super.onCreateOptionsMenu(menu,inflater);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int stack = getActivity().getSupportFragmentManager().getBackStackEntryCount();
    switch (item.getItemId()) {
        case R.id.action_settings:
            Log.d(TAG6,Integer.toString(stack));
            return true;
        default:
            break;
    }
    return false;
}
}

Фрагмент детали:

public class ProductTabsFragment extends Fragment {

final String TAG1 = "TabFrag: onCreate";
final String TAG2 = "TabFrag: onResume";
final String TAG3 = "TabFrag: ActionSettings";
final String TAG4 = "TabFrag: home";
final String TAG5 = "TabFrag: onBckStkChng";
final String TAG6 = "TabFrag: onNavigateUp";

public ProductTabsFragment() {
    // Required empty public constructor
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
    int stack = getActivity().getSupportFragmentManager().getBackStackEntryCount();
    Log.d(TAG1,Integer.toString(stack));
    boolean canback = stack>0;
    ((AppStart)getActivity()).resetActionBar(canback);
}

@Override
public void onResume() {
    super.onResume();
    int stack = getActivity().getSupportFragmentManager().getBackStackEntryCount();
    Log.d(TAG2,Integer.toString(stack));
    boolean canback = stack>0;
    ((AppStart)getActivity()).resetActionBar(canback);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    return inflater.inflate(R.layout.fragment_product_tabs, container, false);
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    // Inflate the menu; this adds items to the action bar if it is present.
    inflater.inflate(R.menu.toolbar_menu, menu);
    super.onCreateOptionsMenu(menu,inflater);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int stack = getActivity().getSupportFragmentManager().getBackStackEntryCount();
    switch (item.getItemId()) {
        case R.id.action_settings:
            Log.d(TAG3,Integer.toString(stack));
            return true;
        case android.R.id.home:
            Log.d(TAG4,Integer.toString(stack));
            //getActivity().onBackPressed();
            return true;
        default:
            break;
    }
    return false;
}

}

Также это код в адаптере ресайклера, когда карта щелкает для загрузки подробного фрагмента:

cvProduct.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view) {
                ProductTabsFragment productTabsFragment = new ProductTabsFragment();
                AppCompatActivity activity = (AppCompatActivity) view.getContext();
                FragmentTransaction transaction = activity.getSupportFragmentManager().beginTransaction();
                transaction.replace(R.id.fragment_container,productTabsFragment);
                transaction.addToBackStack(null);
                transaction.commit();
            }
        });



Ответы (1)


Для тех, у кого может быть такая проблема. Оказывается, когда используется ActionBarDrawerToggle, для обратной стрелки необходимо использовать setToolbarNavigationClickListener.

Кажется, R.id.home в optionitemselected отключен. Надеюсь это поможет!

поэтому я удалил из onOptionsItemSelected (элемент MenuItem):

case android.R.id.home:
        Log.d(TAG4,Integer.toString(stack));
        return true;

и измененный resetActionBar (логическое дочернее действие) в основном действии, которое вызывается при создании фрагмента A и фрагмента B.

public void resetActionBar(boolean childAction)
{
    Log.d(TAG1,Boolean.toString(childAction));
    if (childAction) {
        actionBarDrawerToggle.setDrawerIndicatorEnabled(false);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setHomeButtonEnabled(true);
        actionBarDrawerToggle.setToolbarNavigationClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                Log.d(TAG4,"Clicked");
                onBackPressed();
            }
        });
    } else {
        getSupportActionBar().setHomeButtonEnabled(false);
        getSupportActionBar().setDisplayHomeAsUpEnabled(false);
        actionBarDrawerToggle.setDrawerIndicatorEnabled(true);
    }
}
person Kurt    schedule 19.02.2017