Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/225.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 为什么onBackPressed会杀死我的应用程序?_Android_Android Fragments_Back Stack_Fragment Backstack - Fatal编程技术网

Android 为什么onBackPressed会杀死我的应用程序?

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

当我开始做这项工作时,我使用的是mapbox android api,而不是谷歌地图api。我不认为这与出了什么问题有多大关系,但是,我确实在某个时候做了很好的后盾

现在,我可以一直到我的视频播放器片段。(第三个在后靠背上)。如果我从那里点击后退按钮,回收器视图将显示,然后应用程序将从屏幕上消失。如果我从地图上转到“回收器”视图,然后按backpress键,地图将显示,然后立即从屏幕上消失

请让我知道,如果有什么我可以张贴澄清的事情

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

}