1. 程式人生 > >頻繁切換fragment報空的問題----fragment的切換-----再按一次退出程式

頻繁切換fragment報空的問題----fragment的切換-----再按一次退出程式

頻繁切換fragment時getActivity()會報空  還有長時間未進入app的時候fragment會報空

第一種方法:

在Fagment里加如下程式碼:

private Context context;

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        context = activity;
    }

    @Override
    public void onDetach() {
        super.onDetach();
        context = null;
    }
第二種方法:

在activity中新增如下程式碼:

 /**
     * 避免fragment切換得時候使用者長時間沒有執行app,
     * 導致fragment中getActivity()報空
     */
    @Override
    public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
//        super.onSaveInstanceState(outState, outPersistentState);
    }
第三種方式:判斷fragment是否為空
if (fragment==null){
                        fragment = new HomeFragment();
                    }
Android再按一次退出程式:
/**
     * @return 當點選返回鍵的時候不要退出
     * 執行再按一次退出程式
     * 如果第二次按的時間和第一次按的時間在2s之內就退出程式
     */
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            if (System.currentTimeMillis() - exittime < 2000) {
                Log.i(TAG, "onKeyDown: " + "退出程式");
                finish();
                System.exit(0);
            } else {
                Toast.makeText(this, "再按一次退出程式", Toast.LENGTH_SHORT).show();
                exittime = System.currentTimeMillis();
            }
        }
        return false;
    }
fragment的切換:首次載入fragment的時候replace,然後點選按鈕的時候switchFragment,先判斷一下fragment是否為空,如果為空的話新建一個。。
package com.ruru.fragment;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.widget.Toast;

public class SecondActivity extends AppCompatActivity implements View.OnClickListener {

    private Fragment top;
    private Fragment fg_01, fg_02;
    boolean f = false;
    private long time;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        initView();
        initPage();
    }

    private void initView() {
        findViewById(R.id.btn_left).setOnClickListener(this);
        findViewById(R.id.btn_right).setOnClickListener(this);
    }

    private void initPage() {
        FragmentManager fm = getSupportFragmentManager();
        FragmentTransaction transaction = fm.beginTransaction();
        top = new Fragment01();
        fg_01 = top;
        transaction.replace(R.id.contentFrame, top);
        transaction.commit();
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.btn_left:
                if (fg_01 == null) {
                    fg_01 = new Fragment01();
                }
                switchFragment(fg_01);
                f = true;
                break;
            case R.id.btn_right:
                if (fg_02 == null) {
                    fg_02 = new Fragment02();
                }
                switchFragment(fg_02);
                f = true;
                break;
            default:
                break;
        }
    }

    private void switchFragment(Fragment to) {
        if (top != to) {
            FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
            if (!to.isAdded()) { // 先判斷是否被add過
                transaction.hide(top).add(R.id.contentFrame, to).commit(); // 隱藏當前的fragment,add下一個到Activity中
            } else {
                transaction.hide(top).show(to).commit(); // 隱藏當前的fragment,顯示下一個
            }
            top = to;
        }
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            if (f) {
                switchFragment(fg_01);
                f = false;
            } else {
                if (System.currentTimeMillis() - time < 2000) {
                    finish();
                    System.exit(0);
                } else {
                    Toast.makeText(this, "再按一次退出程式", Toast.LENGTH_SHORT).show();
                    time = System.currentTimeMillis();
                }
            }
        }
        return false;
    }
}

還有另外一種方法:tag的方法:

package com.ruru.fragment;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private FragmentManager fm;
    private String tagLeft;
    private String tagRight;
    private String tagTop;
    private FragmentTransaction transaction;
    private Fragment01 fragment01;
    private Fragment02 fragment02;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initView();
        initPage();
    }

    private void initPage() {
        tagLeft = "tagleft";
        tagRight = "tagright";
        fm = getSupportFragmentManager();
        transaction = fm.beginTransaction();
        Fragment01 fragment01 = new Fragment01();
        transaction.add(R.id.contentFrame, fragment01, tagLeft);
        tagTop = tagLeft;
        transaction.commit();
    }

    private void initView() {
        findViewById(R.id.btn_left).setOnClickListener(this);
        findViewById(R.id.btn_right).setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.btn_left:
                switchFragment(tagLeft);
                break;
            case R.id.btn_right:
                switchFragment(tagRight);
                break;
            default:
                break;
        }
    }

    private void switchFragment(String tag) {
        FragmentTransaction transaction = fm.beginTransaction();
        Fragment top = fm.findFragmentByTag(tagTop);
        Fragment target = fm.findFragmentByTag(tag);
        if (top != null) {
            if (target == null) {
                if (tag.equals(tagLeft)) {
                    target = new Fragment01();
                } else if (tag.equals(tagRight)) {
                    target = new Fragment02();
                }
                transaction.hide(top);
                transaction.add(R.id.contentFrame, target, tag);
            } else {
                transaction.hide(top);
                transaction.show(target);
            }
            transaction.commit();
            tagTop = tag;
        } else {
            fm = getSupportFragmentManager();
            transaction = fm.beginTransaction();
            Fragment01 fragment01 = new Fragment01();
            transaction.add(R.id.contentFrame, fragment01, tagLeft);
            tagTop = tagLeft;
            transaction.commit();
        }
    }
}