自定義 Footer extends RelativeLayout 中呼叫 getSupportFragmentManager() 報錯:undefined for type Footer。
View 只有 getContext(),回傳 Context(通常是 Activity),但 Context 沒有 getSupportFragmentManager() 方法,只有 FragmentActivity 或 AppCompatActivity 有。
// 在自定義 View 內部
FragmentActivity activity = (FragmentActivity) getContext();
FragmentManager fm = activity.getSupportFragmentManager();
// 或
FragmentManager fm = ((FragmentActivity) getContext()).getSupportFragmentManager();
避免 View 直接持有 Activity 參考,定義介面:
public interface FragmentNavigator {
FragmentManager getSupportFragmentManager();
}
// Activity 實現介面
public class MainActivity extends AppCompatActivity implements FragmentNavigator { ... }
// View 建構子傳入介面
public Footer(Context context, FragmentNavigator navigator) {
super(context);
this.navigator = navigator;
}
降低耦合,利於測試與複用。