我使用的片段不是这个,导入android.app.Fragment
我使用这个,导入android.support.v4.app.Fragment
因为我将它用于viewpager
public class PagerAdapter extends FragmentPagerAdapter{
public PagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
if(position == 0){
return new FragmentOne();
}else if(position == 1){
return new FragmentTwo();
}
}
@Override
public int getCount() {
return 2;
}
}
在这种情况下,FragmentOne扩展导入android.support.v4.app.Fragment 所以不是错误,但FragmentTwo扩展导入android.app.Fragment所以它发生错误
所以我有两个问题
如果我使用viewpager,Fragment必须是扩展导入android.support.v4.app.Fragment?
如果我必须扩展导入android.support.v4.app.Fragment,我怎么能使用onactivityresult?
答案 0 :(得分:2)
如果您希望旧版支持添加support
库,则您只能在应用中使用其中一个库。
要通知您的片段有关活动结果的更改,您可以使用界面来完成。
在您的活动中:
public interface ActivityResultListener {
onActivityResult(int requestCode, int resultCode, Intent data);
}
为set
和remove
ActivityResultListener
然后,当您收到活动结果时,通知您的听众是否存在。
public void setActivityResultListener(ActivityResultListener listener){
// You need the listener (ActivityResultListener) variable in the Activity
this.listener = listener;
}
public void removeActivityResultListener(){
listener = null;
}
在片段中实现界面:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(listener != null){
listener.onActivityResult(requestCode, resultCode, data);
}
}
这会强制您覆盖public class WhateverFragment implements MyActivity.ActivityResultListener{
// ....
}
方法。在活动获得结果时,您将收到结果,按照您的意愿行事。只剩下一步,将onActivityResult
设置为WhateverFragment
上的onAttach
并将其移除onDetach
方法。
onAttach
方法:
((MyActivity)getActivity()).setActivityResultListener(this);
onDetach
方法:
((MyActivity)getActivity()).removeActivityResultListener();
这已经动态写入,因此可能存在错误。
答案 1 :(得分:0)
理想情况下,您应该只使用支持库的Fragment,即android.support.v4.app.Fragment来实现向后兼容。
由于您正在使用片段适配器,它是支持库中可用的类,仅处理android.support.v4.app.Fragment,因此您必须使用支持库的片段。
您可以像android.support.v4.app.Fragment
一样使用android.app.fragment
正常工作。支持库也有onActivityResult
方法,可以很容易地继承。
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
}
答案 2 :(得分:0)
对于第一 - 如果您的应用需要支持api level 15,请使用 android.support.v4.app.Fragment 。 否则,如果您的最小api级别为17,则可以使用 android.app.Fragment
第二次 - 在你的Activity类 -
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case <requestCode>:
((FragmentOne)pageAdapter.getItem(0)).onActivityResult(requestCode, resultCode, data);
break;
}
}
答案 3 :(得分:0)
第一个问题
如果我使用viewpager,Fragment必须是扩展导入android.support.v4.app.Fragment?
要使用FragmentPagerAdapter或FragmentStatePagerAdapter。
案例1:如果您将应用程序定位为低于17 android api级别,请使用支持库。 (android.app.Fragment中没有17个以下的childFragmentManager)
案例2:如果你的目标应用为17及以上的android api,那么使用android.app.Fragment。 (从api级别17及以上的childFragmentManager可用android.app.Fragment)
要使用PagerAdapter
您可以选择任何支持库或android.app.Fragment。
第二个问题
如果我必须扩展导入android.support.v4.app.Fragment,我怎么能使用onactivityresult?
查看此Answer。