2016-04-03 2 views
0

У меня есть приложение с навигационным ящиком. Он состоит из двух элементов: Main и Settings. Все элементы - фрагменты. «Настройки» расширяет PreferenceFragment.Когда я отжимаю фрагмент (PreferenceFragment) - приложение закрыто

У меня проблема. Когда я запустил приложение - откройте MainFragment. Они переключаются на PreferencesFragment, а затем нажимают Back. В этом случае мое приложение должно переключиться на MainFragment, но приложение закрыто.

MainActivity

import android.app.Fragment; 
import android.app.FragmentManager; 
import android.app.FragmentTransaction; 
import android.content.res.Configuration; 
import android.os.Bundle; 
import android.support.annotation.Nullable; 
import android.support.v4.view.GravityCompat; 
import android.support.v4.widget.DrawerLayout; 
import android.support.v7.app.ActionBarDrawerToggle; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.Toolbar; 
import android.util.Log; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.ListView; 

import com.egoriku.lesson_16.R; 
import com.egoriku.lesson_16.adapters.ClassAdapter; 
import com.egoriku.lesson_16.adapters.DataAdapter; 
import com.egoriku.lesson_16.fragments.MainFragment; 
import com.egoriku.lesson_16.fragments.PreferencesFragment; 

import java.util.ArrayList; 
import java.util.List; 

public class MainActivity extends AppCompatActivity { 

private Toolbar toolbar; 
private DrawerLayout drawerLayout; 
private ActionBarDrawerToggle drawerToggle; 
private ListView drawerListView; 
private List<DataAdapter> list; 
private ClassAdapter adapter; 


public static final String TAG_MAIN = "TAG_MAIN"; 
public static final String TAG_SETTING = "TAG_SETTING"; 

private String itemDrawerMain; 
private String itemDrawerSettings; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Log.e("onCreate", "start"); 

    itemDrawerMain = getString(R.string.item_drawer_main); 
    itemDrawerSettings = getString(R.string.item_drawer_settings); 

    drawerLayout = (DrawerLayout) findViewById(R.id.draver_layout); 
    toolbar = (Toolbar) findViewById(R.id.toolbar); 

    drawerListView = (ListView) findViewById(R.id.nav_list); 
    drawerListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); 

    list = new ArrayList<>(); 
    AddMenuItem(list); 

    drawerListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      String tag = list.get(position).getTagFragment(); 

      if (tag.equals(MainFragment.TAG_MAINFRAGMENT)) { 
       showFragment(
         MainFragment.newInstance(), 
         MainFragment.TAG_MAINFRAGMENT, 
         null, 
         true 
       ); 
       drawerLayout.closeDrawers(); 
      } 

      if (tag.equals(PreferencesFragment.TAG_PREFERENCE)) { 
       showFragment (
         PreferencesFragment.newInstanse(), 
         PreferencesFragment.TAG_PREFERENCE, 
         MainFragment.TAG_MAINFRAGMENT, 
         false 
       ); 
       drawerLayout.closeDrawers(); 
      } 
     } 
    }); 

    setSupportActionBar(toolbar); 
    drawerToggle = new ActionBarDrawerToggle(
      this, 
      drawerLayout, 
      toolbar, 
      R.string.drawer_open, 
      R.string.drawer_close 
    ); 

    drawerLayout.addDrawerListener(drawerToggle); 

    if (savedInstanceState == null) { 
     Log.e("savedInstanceState", "start"); 

     showFragment(MainFragment.newInstance(), MainFragment.TAG_MAINFRAGMENT, null, true); 
    } 
} 

private void AddMenuItem(List<DataAdapter> list) { 
    Log.e("AddMenuItem", "start"); 
    list.add(new DataAdapter(itemDrawerMain, R.drawable.ic_main_black, MainFragment.TAG_MAINFRAGMENT)); 
    list.add(new DataAdapter(itemDrawerSettings, R.drawable.ic_setting_black, PreferencesFragment.TAG_PREFERENCE)); 
    drawerListView.setAdapter(new ClassAdapter(list, this)); 
} 

//функция для переключения фрагментом 
private void showFragment(
     Fragment fragment, 
     String tag, 
     String clearToTag, 
     boolean clearInclusive 
) { 
    Log.e("showFragment", "start"); 

    FragmentManager fragmentManager = getFragmentManager(); 

    if (clearToTag != null || clearInclusive) { 
     fragmentManager.popBackStack(
       clearToTag, 
       clearInclusive ? FragmentManager.POP_BACK_STACK_INCLUSIVE : 0 
     ); 
    } 

    FragmentTransaction transaction = fragmentManager.beginTransaction(); 
    transaction.replace(R.id.fragment_container, fragment, tag); 
    transaction.addToBackStack(tag); 
    transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); 
    transaction.commit(); 
} 

//нужен для drawer toggle 
@Override 
protected void onPostCreate(@Nullable Bundle savedInstanceState) { 
    Log.e("onPostCreate", "start"); 
    super.onPostCreate(savedInstanceState); 
    drawerToggle.syncState(); 
} 

//нужен для drawer toggle 
@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    Log.e("onConfigurationChanged", "start"); 
    super.onConfigurationChanged(newConfig); 
    drawerToggle.onConfigurationChanged(newConfig); 
} 

//нужен для drawer toggle 
@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    Log.e("onOptionsItemSelected", "start"); 
    return drawerToggle.onOptionsItemSelected(item) || super.onOptionsItemSelected(item); 
} 

//нужно для хорошего UX 
@Override 
public void onBackPressed() { 
    if (drawerLayout.isDrawerVisible(GravityCompat.START)) { 
     drawerLayout.closeDrawer(GravityCompat.START); 
     Log.e("onBask", "start"); 
     return; 
    } 

    Log.e("onback", String.valueOf(getFragmentManager().getBackStackEntryCount())); 
    if (getFragmentManager().getBackStackEntryCount() == 1) { 
     finish(); 
     Log.e("onBask", "count"); 
     return; 
    } 
    super.onBackPressed(); 
} 
} 

MainFragment

import android.app.Fragment; 
import android.content.Intent; 
import android.os.Bundle; 
import android.support.annotation.Nullable; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.Button; 
import android.widget.EditText; 

import com.egoriku.lesson_16.R; 
import com.egoriku.lesson_16.activities.ResultActivity; 

public class MainFragment extends Fragment { 
    public MainFragment() { 
    } 

    public static final String TAG_MAINFRAGMENT = "TAG_MAINFRAGMENT"; 

    public static MainFragment newInstance() { 
     return new MainFragment(); 
    } 

    private Button btnGetResult; 
    private EditText editText; 

    @Override 
    public void onStart() { 
     super.onStart(); 
     getActivity().setTitle(R.string.app_name); 
    } 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.fragment_main, container, false); 

     btnGetResult = (Button) v.findViewById(R.id.main_fragment_btn); 
     editText = (EditText) v.findViewById(R.id.main_fragment_edit_text); 

     btnGetResult.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       startActivity(new Intent(getActivity(), ResultActivity.class) 
           .putExtra(ResultActivity.EXTRA_EDIT_TEXT, editText.getText().toString()) 
       ); 
      } 
     }); 

     return v; 
    } 
} 
+0

http://stackoverflow.com/questions/36326776/mainactivity-to-fragment-and-back-to-mainactivity-on-pressing-back-button/36327038#36327038 –

+0

в PreferencesFragment, который вы должны реализовать onBackPressed mehod кроме того, вы должны уволить намерение к вашему целевому фрагменту или активности. –

+0

Вы не можете реализовать onBackPressed в фрагменте @AmitRanjan. Только в деятельности. – Vucko

ответ

2

Ну конечно, что приложение будет закрыто, так как вы в основном только 1 активность, в которой вы переключение двух различных фрагментов.

Решения вашей проблемы будет переопределить метод onBackPressed, чтобы проверить, если вы в настройках фрагмент (вы можете использовать некоторый индикатор проверить, какой фрагмент в настоящее время активен), и если вы в Settings просто заново откройте MainFragment.

@Override 
public void onBackPressed() { 
     if (inSettingsFragment) 
      showFragment(MainFragment.newInstance(),MainFragment.TAG_MAINFRAGMENT,null,true); 
     else { finish();} 
    } 
2

Override onBackPressed() в вашем MainActivity в способе, которым вы хотите работать, вы можете проверить, если вы находитесь в Settings фрагмент, а не выход, если вы, и просто показать Main фрагмент вместо этого, и если вы находитесь в фрагменте Main, затем вы можете позвонить finish().

Смежные вопросы