android 獲取當前fragment單個物件(解決fragment返回鍵問題)
阿新 • • 發佈:2019-01-30
在做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雖然都有返回的作用,但是他們是有區別的。