頻繁切換fragment報空的問題----fragment的切換-----再按一次退出程式
阿新 • • 發佈:2019-01-03
頻繁切換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是否為空
Android再按一次退出程式:if (fragment==null){ fragment = new HomeFragment(); }
fragment的切換:首次載入fragment的時候replace,然後點選按鈕的時候switchFragment,先判斷一下fragment是否為空,如果為空的話新建一個。。/** * @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; }
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();
}
}
}