在ViewPager中未触发SupportPlaceAutocompleteFragment的OnPlaceSelectedListener

时间:2015-12-29 08:57:30

标签: android android-viewpager google-places-api

我的应用程序具有viewPager和4个片段的活动。 在一个片段中,我添加了一个Google SupportPlaceAutocompleteFragment

 public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.area_swipe_fragment, container, false);



    SupportPlaceAutocompleteFragment autocompleteFragment = (SupportPlaceAutocompleteFragment)
            getChildFragmentManager().findFragmentById(R.id.place_autocomplete_fragment);

    autocompleteFragment.setOnPlaceSelectedListener(new PlaceSelectionListener() {
        @Override
        public void onPlaceSelected(Place place) {
            Toast.makeText(ctx, "do something", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onError(Status status) {
        }
    });






    return view;
}

我的问题是onPlaceSelectedListener永远不会被解雇,我无法获得所选地点的结果。而是被解雇放在第二个片段中的onActivityResults()。 我尝试在第一个片段中使用onActivityResults()但它没有被触发,总是执行第二个片段中的那个。

有什么想法吗?

4 个答案:

答案 0 :(得分:2)

来自the docs

  

如果您的片段嵌套在另一个片段中,您的应用也必须   forward onActivityResult()调用包含的片段,如图所示   在以下代码段中:

    // 1
    double dx = xPos - b.xPos;
    double dy = yPos - b.yPos;
    double r = Math.sqrt(dx*dx + dy*dy);
    double F = G * mass * b.mass / (r*r);

    // 2
    double Fx = G * mass * b.mass / Math.pow( Math.sqrt(Math.pow(2,xPos-b.xPos) + Math.pow(2,yPos-b.yPos)), 2);

也许这就是解决方案。

答案 1 :(得分:1)

The @AndrewR answer took me on the right track, very similar to the comments, I override onActivityResult however it didn't work.

The problem was the host Activity wasn't calling the super:

public class HostActivity extends AppCompatActivity {

    //Please don't forget other relevant methods

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        //super.onActivityResult... is the important line
        //Add other custom behaviours
    }
}

答案 2 :(得分:0)

假设为您的api密钥正确启用了针对Android服务的Google Places API,即使我使用SupportPlaceAutocompleteFragment观察到类似的问题,其中onPlaceSelected永远不会在地点选择上被触发。然而,后来当我尝试使用intent方法时,事情很有效。

答案 3 :(得分:0)

今天早上我遇到了这个问题,经过一堆阅读和随机类似的问题后,我得到了以下工作。

如果您查看SupportPlaceAutocompleteFragment的源代码,您会看到它调用

public class SupportPlaceAutocompleteFragment extends Fragment {
    private void zzzG() {
        ...
        try {
            Intent var2 = (new IntentBuilder(2)).setBoundsBias(this.zzaRk).setFilter(this.zzaRl).zzeq(this.zzaRj.getText().toString()).zzig(1).build(this.getActivity());
            this.startActivityForResult(var2, 1);
        }
        ...
    }

    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if(requestCode == 1) {
            ...
        }
        super.onActivityResult(requestCode, resultCode, data);
    }
}

根据您的集成,这会导致RequestCode更改为1以外的其他内容。通过扩展它来覆盖startActivityForResult,您可以通过调用getActivity()来更改行为.startActivityForResult而不是this.startActivityForResult

public class WrappedSupportPlaceAutocompleteFragment extends SupportPlaceAutocompleteFragment {
@Override
public void startActivityForResult(Intent intent, int requestCode) {
    this.getActivity().startActivityForResult(intent, requestCode);
}

}

从那里你可以按照AndrewR提到的那样,将活动的活动结果传递给片段并获得预期的结果。