1. 程式人生 > >android 獲取當前fragment單個物件(解決fragment返回鍵問題)

android 獲取當前fragment單個物件(解決fragment返回鍵問題)

在做fragment返回的時候,因為fragment裡不能直接寫onKeyDown方法,所以只能在fragmentactivity裡操作(我的fragment都是依附在fragmentactivity上的,通過tabhost顯示出來)。在這邊有兩種方法:
方法一:在這邊只要獲取到當前的fragment單個物件就可以實現了,再用instanceof進行判斷是哪個fragment。
貼程式碼:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {


if (keyCode == KeyEvent.KEYCODE_BACK) {
Fragment ft = (Fragment) getSupportFragmentManager().findFragmentById(R.id.realtabcontent);//realtabcontent為你的容器,裝載fragment的
if (ft instanceof HomeFragment || ft instanceof PersonalFragment) { if ((System.currentTimeMillis() - mExitTime) > 2000) { Toast.makeText(this, "再按一次退出程式", Toast.LENGTH_SHORT).show(); mExitTime = System.currentTimeMillis(); } else { finish(); } return true; } else if (ft instanceof LoginFragment) { ((LoginFragment) ft).onKeyDown(keyCode, event);//onKeyDown在LoginFragment裡面重寫了,只是隨便寫了一個方法而已.......
return false; } else if (ft instanceof RegisterFragment) { ((RegisterFragment) ft).onKeyDown(keyCode, event); return false; } } return super.onKeyDown(keyCode, event); }

方法二:自定義一個BackHandledFragment,在寫一個BackHandledInterface介面,通過這個介面,可以呼叫BackHandledFragment裡面的ononBackPressed()。
BackHandledFragment.java

package com.example.demo.fragment;
import com.example.sihaiproject.interfaces.BackHandledInterface;
import android.os.Bundle;
import android.support.v4.app.Fragment;
public abstract class BackHandledFragment extends Fragment {
protected BackHandledInterface mBackHandledInterface;

/**
* 所有繼承BackHandledFragment的子類都將在這個方法中實現物理Back鍵按下後的邏輯
* FragmentActivity捕捉到物理返回鍵點選事件後會首先詢問Fragment是否消費該事件
* 如果沒有Fragment訊息時FragmentActivity自己才會消費該事件
*/
public abstract boolean onBackPressed();

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

if(!(getActivity() instanceof BackHandledInterface)){
throw new ClassCastException("Hosting Activity must implement BackHandledInterface");
}else{
this.mBackHandledInterface = (BackHandledInterface)getActivity();
}
}

@Override
public void onStart() {
super.onStart();
//告訴FragmentActivity,當前Fragment在棧頂
mBackHandledInterface.setSelectedFragment(this);
}

}
BackHandledInterface.java
package com.example.demo.interfaces;
import com.example.sihaiproject.fragment.BackHandledFragment;
public interface BackHandledInterface {
public abstract void setSelectedFragment(BackHandledFragment selectedFragment);
}

在你的fragment中宣告一個private boolean hadIntercept;,然後重寫

@Override
public boolean onBackPressed() {
if(hadIntercept){
return false;
}else{
getFragmentManager().popBackStack();
hadIntercept = true;
return true;
}
}

在fragmentactivity宣告private BackHandledFragment mBackHandedFragment;,然後重寫setSelectedFragment方法:

@Override
public void setSelectedFragment(BackHandledFragment selectedFragment) {
this.mBackHandedFragment = selectedFragment;
}

重寫fragmentactivity裡的onBackPressed方法:

@Override
public void onBackPressed() {
if (mBackHandedFragment == null || !mBackHandedFragment.onBackPressed()) {
if (getSupportFragmentManager().getBackStackEntryCount() == 0) {
finish();
} else {
getSupportFragmentManager().popBackStack();
}
}
}

ok!這就是所有的程式碼了,直接複製到專案裡就可以的。
主要是Fragment ft = (Fragment) getSupportFragmentManager().findFragmentById(R.id.realtabcontent);,這句話的作用就是獲取當前fragment物件。
也可以通過findfragmentbyid或findfragmentbttag來獲取。
onKeyDown和onBackPressed雖然都有返回的作用,但是他們是有區別的。