Android 为什么onBackPressed会杀死我的应用程序?
当我开始做这项工作时,我使用的是mapbox android api,而不是谷歌地图api。我不认为这与出了什么问题有多大关系,但是,我确实在某个时候做了很好的后盾 现在,我可以一直到我的视频播放器片段。(第三个在后靠背上)。如果我从那里点击后退按钮,回收器视图将显示,然后应用程序将从屏幕上消失。如果我从地图上转到“回收器”视图,然后按backpress键,地图将显示,然后立即从屏幕上消失 请让我知道,如果有什么我可以张贴澄清的事情Android 为什么onBackPressed会杀死我的应用程序?,android,android-fragments,back-stack,fragment-backstack,Android,Android Fragments,Back Stack,Fragment Backstack,当我开始做这项工作时,我使用的是mapbox android api,而不是谷歌地图api。我不认为这与出了什么问题有多大关系,但是,我确实在某个时候做了很好的后盾 现在,我可以一直到我的视频播放器片段。(第三个在后靠背上)。如果我从那里点击后退按钮,回收器视图将显示,然后应用程序将从屏幕上消失。如果我从地图上转到“回收器”视图,然后按backpress键,地图将显示,然后立即从屏幕上消失 请让我知道,如果有什么我可以张贴澄清的事情 public class MainActivity exten
public class MainActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener, OnMapReadyCallback, FragmentManager.OnBackStackChangedListener {
FragmentManager fragmentManager = getFragmentManager();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.setDrawerListener(toggle);
toggle.syncState();
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
fragmentManager.addOnBackStackChangedListener(this);
FragmentTransaction ft = fragmentManager.beginTransaction();
MapFragment mapFragment = (MapFragment) getFragmentManager().findFragmentById(R.id.map);
ft.addToBackStack("Main Fragment");
ft.commit();
mapFragment.getMapAsync(this);
}
@Override
public void onMapReady(GoogleMap googleMap) {
LatLng sydney = new LatLng(-33.867, 151.206);
map.setMyLocationEnabled(true);
map.moveCamera(CameraUpdateFactory.newLatLngZoom(sydney, 13));
map.addMarker(new MarkerOptions()
.title("Sydney")
.snippet("The most populous city in Australia.")
.position(sydney));
}
@Override
public void onBackPressed() {
if (fragmentManager.getBackStackEntryCount() != 0) {
fragmentManager.popBackStackImmediate();
}else {
super.onBackPressed();
}
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
} else {
super.onBackPressed();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public boolean onNavigationItemSelected(MenuItem item) {
// Handle navigation view item clicks here.
String title = item.getTitle().toString();
if (title.equals("Topic One")) {
FragmentTransaction ft = fragmentManager.beginTransaction();
RecyclerViewFragment rvs = new RecyclerViewFragment().newInstance(0);
ft.setCustomAnimations(R.animator.top_to_bottom_fragment, android.R.animator.fade_out);
ft.replace(R.id.map, rvs, "subject_cards");
ft.addToBackStack("Topic One");
ft.commit();
} else if (title.equals("Topic Two")) {
FragmentTransaction ft = getFragmentManager().beginTransaction();
RecyclerViewFragment rvs = new RecyclerViewFragment().newInstance(1);
ft.replace(R.id.map, rvs, "subject_cards");
ft.addToBackStack("Topic Two");
ft.commit();
}
}
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return true;
}
@Override
public void onStart() {
super.onStart();
}
@Override
public void onResume() {
super.onResume();
}
@Override
public void onPause() {
super.onPause();
}
@Override
public void onStop() {
super.onStop();
}
@Override
public void onBackStackChanged() {
FragmentManager fm = getFragmentManager();
int bsCOunt = fm.getBackStackEntryCount();
for(int i = 0; i < bsCOunt; i++){
System.out.println( "Fragment name: " + fm.getBackStackEntryAt(i).getName() +"\n");
System.out.println("");
}
}
}
public类MainActivity扩展了AppCompatActivity
实现NavigationView.OnNavigationItemSelectedListener、OnMapReadyCallback、FragmentManager.OnBackBackbackChangedListener{
FragmentManager FragmentManager=getFragmentManager();
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar Toolbar=(Toolbar)findViewById(R.id.Toolbar);
设置支持操作栏(工具栏);
抽屉布局抽屉=(抽屉布局)findViewById(R.id.抽屉布局);
ActionBarDrawerToggle切换=新建ActionBarDrawerToggle(
这,抽屉,工具栏,R.string.navigation\u drawer\u open,R.string.navigation\u drawer\u close);
抽屉。设置抽屉定位器(开关);
toggle.syncState();
NavigationView NavigationView=(NavigationView)findViewById(R.id.nav_视图);
navigationView.setNavigationItemSelectedListener(此);
fragmentManager.AddonBackbackChangedListener(此);
FragmentTransaction ft=fragmentManager.beginTransaction();
MapFragment MapFragment=(MapFragment)getFragmentManager().findFragmentById(R.id.map);
ft.addToBackStack(“主要片段”);
ft.commit();
getMapAsync(这个);
}
@凌驾
4月1日公开作废(谷歌地图谷歌地图){
悉尼LatLng=新LatLng(-33.867151.206);
map.setMyLocationEnabled(true);
移动摄像机(CameraUpdateFactory.newLatLngZoom(悉尼,13));
addMarker(新的MarkerOptions()
.标题(“悉尼”)
.snippet(“澳大利亚人口最多的城市”)
.职位(悉尼);
}
@凌驾
public void onBackPressed(){
如果(fragmentManager.GetBackbackEntryCount()!=0){
fragmentManager.popbackbackimmediate();
}否则{
super.onBackPressed();
}
抽屉布局抽屉=(抽屉布局)findViewById(R.id.抽屉布局);
if(抽屉isDrawerOpen(重力压缩机启动)){
抽屉。关闭抽屉(重力压缩机启动);
}否则{
super.onBackPressed();
}
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
getMenuInflater().充气(R.menu.main,menu);
返回true;
}
@凌驾
公共布尔值onOptionsItemSelected(菜单项项){
int id=item.getItemId();
if(id==R.id.action\u设置){
返回true;
}
返回super.onOptionsItemSelected(项目);
}
@凌驾
公共布尔值onNavigationItemSelected(MenuItem项){
//处理导航视图项单击此处。
字符串标题=item.getTitle().toString();
if(标题等于(“主题一”)){
FragmentTransaction ft=fragmentManager.beginTransaction();
RecyclerViewFragment rvs=新的RecyclerViewFragment().newInstance(0);
ft.setCustomAnimations(R.animator.top\u到\u bottom\u片段,android.R.animator.fade\u淡出);
ft.replace(R.id.map,rvs,“主题卡”);
ft.addToBackStack(“主题一”);
ft.commit();
}else if(标题等于(“主题二”)){
FragmentTransaction ft=getFragmentManager().beginTransaction();
RecycleServicewFragment rvs=新的RecycleServicewFragment().newInstance(1);
ft.replace(R.id.map,rvs,“主题卡”);
ft.addToBackStack(“主题二”);
ft.commit();
}
}
抽屉布局抽屉=(抽屉布局)findViewById(R.id.抽屉布局);
抽屉。关闭抽屉(重力压缩机启动);
返回true;
}
@凌驾
public void onStart(){
super.onStart();
}
@凌驾
恢复时公开作废(){
super.onResume();
}
@凌驾
公共无效暂停(){
super.onPause();
}
@凌驾
公共void onStop(){
super.onStop();
}
@凌驾
BackbackChanged()上的公共无效{
FragmentManager fm=getFragmentManager();
int bsCOunt=fm.getBackStackEntryCount();
对于(int i=0;i
回收服务碎片:
public class RecyclerViewFragment extends Fragment {
private List<Subject> subjects;
static RecyclerView rv;
static int cardViewPosition;
View rootView;
private static final String TAG = "RECYCLER_VIEW_FRAGMENT";
public static RecyclerViewFragment newInstance(int some_Int) {
RecyclerViewFragment frag = new RecyclerViewFragment();
Bundle args = new Bundle();
args.putInt("card_int", some_Int);
frag.setArguments(args);
return frag;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
cardViewPosition = getArguments().getInt("card_int", 0);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
rootView = inflater.inflate(R.layout.recyclerview_activity, container, false);
rootView.setTag(TAG);
rv = (RecyclerView) rootView.findViewById(R.id.rv);
final LinearLayoutManager llm = new LinearLayoutManager(getActivity());
rv.setLayoutManager(llm);
rv.setHasFixedSize(true);
rv.scrollToPosition(cardViewPosition);
initializeData();
initializeAdapter();
return rootView;
}
private void initializeData() {
subjects = new ArrayList<>();
JSONObject obj;
JSONArray jArray = null;
try {
obj = new JSONObject(loadJsonFromAsset());
jArray = obj.getJSONArray("people");
} catch (JSONException e) {
e.printStackTrace();
}
for (int i = 0; i < jArray.length(); i++) {
JSONObject json_data = null;
try {
json_data = jArray.getJSONObject(i);
} catch (JSONException e) {
e.printStackTrace();
}
try {
subjects.add(new Subject(json_data.getInt("id"), json_data.getString("name"), null,
null, getResources().getIdentifier(json_data.getString("photoId"), "drawable",
this.getActivity().getPackageName()), json_data.getString("subjectText"),json_data.getString("expandedSubjectText")));
} catch (JSONException e) {
e.printStackTrace();
}
}
}
private void initializeAdapter() {
RVAdapter adapter = new RVAdapter(subjects,rootView.getContext());
adapter.setOnClickListener(new RVAdapter.MyListener() {
@Override
public void onClick(View v, int i, CharSequence subjectName) {
if (v.equals(v.findViewById(R.id.card_button_left))) {
rv.scrollToPosition(i);
FragmentTransaction ft = getFragmentManager().beginTransaction();
VideoPlayerFragment vFrag = new VideoPlayerFragment().newInstance(subjectName);
ft.setCustomAnimations(R.animator.top_to_bottom_fragment, android.R.animator.fade_out);
ft.replace(android.R.id.content, vFrag);
ft.addToBackStack(null);
ft.commit();
FragmentManager fragmentManager = getFragmentManager();
}else if(v.equals(v.findViewById(R.id.card_button_right))){
rv.scrollToPosition(i);
}
}
});
rv.setAdapter(adapter);
}
public String loadJsonFromAsset() {
String json = null;
InputStream is = getResources().openRawResource(R.raw.people);
try {
int size = is.available();
byte[] buffer = new byte[size];
is.read(buffer);
is.close();
json = new String(buffer, "UTF-8");
} catch (IOException e) {
e.printStackTrace();
}
return json;
}
}
公共类RecycleServicewFragment扩展片段{
私人名单科目;
静态循环视图rv;
静态视图位置;
视图根视图;
私有静态最终字符串TAG=“回收器\u视图\u片段”;
公共静态RecycleServicewFragment newInstance(int some_int){
RecycleServicewFragment frag=新的RecycleServicewFragment();
Bundle args=新Bundle();
args.putInt(“card_int”,some_int);
frag.setArguments(args);
返回碎片;
}
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
cardViewPosition=getArguments().getInt(“card_int”,0);
}
@凌驾
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
rootView=充气机。充气(R.layout.recyclerview_活动,容器,false);
setTag(TAG);
rv=(RecyclerView)rootView.findviewbyd(R.id.rv);
最终LinearLayoutManager llm=新的LinearLayoutManager(getActivity());
rv.setLayoutManager(llm);
rv.setHasFixedSize(真);
rv.滚动位置(cardViewPosition);
初始化数据();
初始化为apter();
返回rootView;
}
private void initializeData(){
subjects=newarraylist();
JSONObject对象;
JSONArray-jArray=null;
试一试{
obj=新的JSONObject(loadJsonFromAsset());
jArray=obj.getJSONArray(“peop
public class VideoPlayerFragment extends Fragment {
private View mCustomView;
private WebChromeClient.CustomViewCallback mCustomViewCallback;
WebView videoDisplay = null;
static CharSequence subjectName;
static String htmlPageForSubject;
CharSequence title;
CharSequence openingText;
CharSequence mainText;
CharSequence[] text;
public static VideoPlayerFragment newInstance(CharSequence subjectName) {
VideoPlayerFragment vFrag = new VideoPlayerFragment();
Bundle arg = new Bundle();
arg.putCharSequence("subject_name", subjectName);
vFrag.setArguments(arg);
return vFrag;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.subjectName = getArguments().getCharSequence("subject_name");
htmlPageForSubject = subjectName.toString().replace(' ', '_');
PeopleReader peopleReader = new PeopleReader(subjectName);
text = peopleReader.fetchText();
title = text[0];
openingText = text[1];
mainText = text[2];
}
@Override
public View onCreateView(LayoutInflater layoutInflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = layoutInflater.inflate(R.layout.webview_layout, container, false);
videoDisplay = (WebView) rootView.findViewById(R.id.webView);
TextView firstTextBox = (TextView) rootView.findViewById(R.id.titleText);
TextView secondTextBox = (TextView) rootView.findViewById(R.id.openingText);
TextView thirdTextBox = (TextView) rootView.findViewById(R.id.mainText);
firstTextBox.setText(title);
secondTextBox.setText(openingText);
thirdTextBox.setText(mainText);
videoDisplay.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return false;
}
});
WebSettings webSettings = videoDisplay.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setDomStorageEnabled(true);
videoDisplay.loadUrl("file:///android_asset/www/" + htmlPageForSubject + ".html");
videoDisplay.setWebChromeClient(new MyWebChromeClient());
return rootView;
}
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
class MyWebChromeClient extends WebChromeClient {
private int mOriginalSystemUiVisibility;
private int mOriginalOrientation;
@Override
public void onShowCustomView(View view, WebChromeClient.CustomViewCallback callback) {
if (mCustomView != null) {
onHideCustomView();
return;
}
mCustomView = view;
mOriginalSystemUiVisibility = getActivity().getWindow().getDecorView().getSystemUiVisibility();
mOriginalOrientation = getActivity().getRequestedOrientation();
mCustomViewCallback = callback;
FrameLayout decor = (FrameLayout) getActivity().getWindow().getDecorView();
decor.addView(mCustomView, new FrameLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT));
getActivity().getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE |
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION |
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
View.SYSTEM_UI_FLAG_FULLSCREEN |
View.SYSTEM_UI_FLAG_IMMERSIVE);
getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
@Override
public void onHideCustomView() {
// 1. Remove the custom view
FrameLayout decor = (FrameLayout) getActivity().getWindow().getDecorView();
decor.removeView(mCustomView);
mCustomView = null;
getActivity().getWindow().getDecorView()
.setSystemUiVisibility(mOriginalSystemUiVisibility);
getActivity().setRequestedOrientation(mOriginalOrientation);
mCustomViewCallback.onCustomViewHidden();
mCustomViewCallback = null;
}
}
class PeopleReader {
CharSequence topicName;
CharSequence[] textArray = new String[3];
public PeopleReader(CharSequence topicName){
this.topicName = topicName;
}
public CharSequence[] fetchText() {
JSONObject obj;
JSONArray jArray = null;
try {
obj = new JSONObject(loadJsonFromAsset());
jArray = obj.getJSONArray("people");
} catch (JSONException e1) {
e1.printStackTrace();
}
for(int i = 0;i<jArray.length();i++){
JSONObject json_data;
try {
json_data = jArray.getJSONObject(i);
if(json_data.getString("name").equals(topicName.toString())){
textArray[0] = json_data.getString("name");
textArray[1] = json_data.getString("subjectText");
textArray[2] = json_data.getString("expandedSubjectText");
}
} catch (JSONException e) {
e.printStackTrace();
}
}
return textArray;
}
public String loadJsonFromAsset() {
String json = null;
InputStream is = getResources().openRawResource(R.raw.people);
try {
int size = is.available();
byte[] buffer = new byte[size];
is.read(buffer);
is.close();
json = new String(buffer, "UTF-8");
} catch (IOException e) {
e.printStackTrace();
}
return json;
}
}
@Override
public void onBackPressed() {
if (fragmentManager.getBackStackEntryCount() != 0) {
fragmentManager.popBackStackImmediate();
return;
}
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
return;
}
// Otherwise defer to system default behavior.
super.onBackPressed();
}