如何通过活页夹将服务发送到 API 级别 14 上的片段?
How to send a service via a binder to a fragment on API level 14?
我在 Android 4.4.4 上制作了一个 Android 应用程序,我想在 Android 4.0.0 上开发它。我在将服务(我的活页夹)发送到片段时遇到问题。
在 Android 4.4.4 我使用以下几行:
AddTrashFragment addTrashFragment = new AddTrashFragment();
Bundle bundle = new Bundle();
bundle.putParcelable("bitmap", bitmap2);
bundle.putString("fileName", fileName);
bundle.putBinder("binder", binder);
addTrashFragment.setArguments(bundle);
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction().replace(R.id.relativeLayout,addTrashFragment).addToBackStack(null).commitAllowingStateLoss();
但是当我尝试使用 Android 4.0.0 构建我的项目时,出现以下错误:
调用需要 API 级别 18(当前最小值为 14):android.os.Bundle#putBinder less (Ctrl + F1)
当我尝试在 Ice Scream Sandwich 上构建项目时,我不明白如何将我的服务、活页夹发送到片段。
因为 Bundle.putBinder()
是 API 18+,所以您必须以不同的方式进行。最简单的方法是让您的 Fragment
定义一个您的 Activity
必须实现的回调接口:
public class MyFragment extends Fragment {
MyFragment.Callback cb;
public interface Callback {
Binder getServiceBinder();
}
...
public void onAttach(Context context) {
try {
cb = (MyFragment.Callback)context;
} catch (ClassCastException e) {
Log.e(TAG, "Activity (Context) must implement Callback");
throw new RuntimeException();
}
}
}
public class MyActivity extends Activity implements MyFragment.Callback {
private Binder mService;
...
public Binder getServiceBinder() {
return mService;
}
}
出现此问题是因为 bundle.putBinder(Binder)
是稍后在 API 18 上添加的。
因此,在 API 14 的设备中,该代码将失败,因为这些设备上不存在该方法。
或许,您可以在 Fragment 中创建一个 public 方法并像这样调用它:
public class AddTrashFragment extends Fragment {
private Binder binder;
public void setBinder(Binder binder) {
this.binder = binder;
}
}
然后在您的 activity 中,您调用:
AddTrashFragment addTrashFragment = new AddTrashFragment();
Bundle bundle = new Bundle();
bundle.putParcelable("bitmap", bitmap2);
bundle.putString("fileName", fileName);
addTrashFragment.setArguments(bundle);
addTrashFragment.setBinder(binder);
或
您可以从 activity 获取活页夹,例如:
public class MainAcitivity extends Activity {
public Binder getBinder() {
return binder;
}
}
在您的片段中:
public AddTrashFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Binder binder;
Activity activity = getActivity();
if(activity != null && activity instanceof MainActivity)
binder = ((MainAcitivity)activity).getBinder();
}
}
您可以使用 BundleCompat
从 Bundle
中放置和获取 IBinder
。
我在 Android 4.4.4 上制作了一个 Android 应用程序,我想在 Android 4.0.0 上开发它。我在将服务(我的活页夹)发送到片段时遇到问题。
在 Android 4.4.4 我使用以下几行:
AddTrashFragment addTrashFragment = new AddTrashFragment();
Bundle bundle = new Bundle();
bundle.putParcelable("bitmap", bitmap2);
bundle.putString("fileName", fileName);
bundle.putBinder("binder", binder);
addTrashFragment.setArguments(bundle);
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction().replace(R.id.relativeLayout,addTrashFragment).addToBackStack(null).commitAllowingStateLoss();
但是当我尝试使用 Android 4.0.0 构建我的项目时,出现以下错误: 调用需要 API 级别 18(当前最小值为 14):android.os.Bundle#putBinder less (Ctrl + F1)
当我尝试在 Ice Scream Sandwich 上构建项目时,我不明白如何将我的服务、活页夹发送到片段。
因为 Bundle.putBinder()
是 API 18+,所以您必须以不同的方式进行。最简单的方法是让您的 Fragment
定义一个您的 Activity
必须实现的回调接口:
public class MyFragment extends Fragment {
MyFragment.Callback cb;
public interface Callback {
Binder getServiceBinder();
}
...
public void onAttach(Context context) {
try {
cb = (MyFragment.Callback)context;
} catch (ClassCastException e) {
Log.e(TAG, "Activity (Context) must implement Callback");
throw new RuntimeException();
}
}
}
public class MyActivity extends Activity implements MyFragment.Callback {
private Binder mService;
...
public Binder getServiceBinder() {
return mService;
}
}
出现此问题是因为 bundle.putBinder(Binder)
是稍后在 API 18 上添加的。
因此,在 API 14 的设备中,该代码将失败,因为这些设备上不存在该方法。
或许,您可以在 Fragment 中创建一个 public 方法并像这样调用它:
public class AddTrashFragment extends Fragment {
private Binder binder;
public void setBinder(Binder binder) {
this.binder = binder;
}
}
然后在您的 activity 中,您调用:
AddTrashFragment addTrashFragment = new AddTrashFragment();
Bundle bundle = new Bundle();
bundle.putParcelable("bitmap", bitmap2);
bundle.putString("fileName", fileName);
addTrashFragment.setArguments(bundle);
addTrashFragment.setBinder(binder);
或
您可以从 activity 获取活页夹,例如:
public class MainAcitivity extends Activity {
public Binder getBinder() {
return binder;
}
}
在您的片段中:
public AddTrashFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Binder binder;
Activity activity = getActivity();
if(activity != null && activity instanceof MainActivity)
binder = ((MainAcitivity)activity).getBinder();
}
}
您可以使用 BundleCompat
从 Bundle
中放置和获取 IBinder
。