簡體   English   中英

更改PlaceAutoCompleteFragment的提示時發生NullPointerException

[英]NullPointerException while changing hint of PlaceAutoCompleteFragment

在我的一個片段中,我實現了PlaceAutocompleteFragment,如下所示:

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    placeAutocompleteFragment = new SupportPlaceAutocompleteFragment();
    getChildFragmentManager().beginTransaction()
            .replace(R.id.place_autocomplete_fragment_container, placeAutocompleteFragment)
            .addToBackStack(SupportPlaceAutocompleteFragment.class.getName())
            .commit();

    EditText etPlace = (EditText) placeAutocompleteFragment.getView().findViewById(R.id.place_autocomplete_search_input);
    etPlace.setHint("Type your address");
}

最后兩行是我嘗試更改搜索欄中的提示文本。 但是,當我添加它們時,出現了異常

java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference

我也嘗試了placeAutocompleteFragment.setHint()。 我應該如何去代替setHint()? 提前致謝。

編輯:崩潰日志顯示以下內容

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.EditText.setHint(java.lang.CharSequence)' on a null object reference
    at me.user.appname.ExploreFragment.onCreateView(ExploreFragment.java:99)
    at android.support.v4.app.Fragment.performCreateView(Fragment.java:2425)
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1460)
    at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1784)
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1852)
    at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:802)
    at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2623)
    at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2410)
    at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2365)
    at android.support.v4.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:2242)
    at android.support.v4.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:654)
    at android.support.v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:168)
    at android.support.v4.view.ViewPager.populate(ViewPager.java:1244)
    at android.support.v4.view.ViewPager.populate(ViewPager.java:1092)
    at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1622)
    at android.view.View.measure(View.java:23265)
    at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:715)
    at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:461)
    at android.view.View.measure(View.java:23265)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6928)
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
    at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:143)
    at android.view.View.measure(View.java:23265)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6928)
    at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1514)
    at android.widget.LinearLayout.measureVertical(LinearLayout.java:806)
    at android.widget.LinearLayout.onMeasure(LinearLayout.java:685)
    at android.view.View.measure(View.java:23265)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6928)
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
    at android.view.View.measure(View.java:23265)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6928)
    at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1514)
    at android.widget.LinearLayout.measureVertical(LinearLayout.java:806)
    at android.widget.LinearLayout.onMeasure(LinearLayout.java:685)
    at android.view.View.measure(View.java:23265)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6928)
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
    at com.android.internal.policy.DecorView.onMeasure(DecorView.java:898)
    at android.view.View.measure(View.java:23265)
    at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2832)
    at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1869)
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2124)
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1738)
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7745)
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:911)
    at android.view.Choreographer.doCallbacks(Choreographer.java:723)
    at android.view.Choreographer.doFrame(Choreographer.java:658)
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:897)
    at android.os.Handler.handleCallback(Handler.java:789)
    at android.os.Handler.dispatchMessage(Handler.java:98)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6938) 08-05 01:26:32.231 28683-28683/me.user.appname E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)

編輯#2:我的ExploreFragment的要點

public class ExploreFragment extends Fragment {
GeoDataClient mGeoDataClient;
SupportPlaceAutocompleteFragment placeAutocompleteFragment;
private OnFragmentInteractionListener mListener;

public ExploreFragment() {
    // Required empty public constructor
}

public static ExploreFragment newInstance(String param1, String param2) 
{
    ExploreFragment fragment = new ExploreFragment();
    return fragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}



@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    // Inflate the layout for this fragment
    final View rootView = inflater.inflate(R.layout.fragment_explore,
            container, false);

    mGeoDataClient = Places.getGeoDataClient(getActivity());

    placeAutocompleteFragment = new SupportPlaceAutocompleteFragment();
    getChildFragmentManager().beginTransaction()
            .replace(R.id.place_autocomplete_fragment_container, placeAutocompleteFragment)
            .addToBackStack(SupportPlaceAutocompleteFragment.class.getName())
            .commit();
    EditText etPlace = (EditText) rootView.findViewById(R.id.place_autocomplete_search_input);
    etPlace.setHint("Type your address");
    return rootView;
}

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
}


@Override
public void onAttach(Context context) {
    super.onAttach(context);
    if (context instanceof OnFragmentInteractionListener) {
        mListener = (OnFragmentInteractionListener) context;
    } else {
        throw new RuntimeException(context.toString()
                + " must implement OnFragmentInteractionListener");
    }
}

@Override
public void onAttachFragment(Fragment childFragment) {
    super.onAttachFragment(childFragment);
    ((SupportPlaceAutocompleteFragment) childFragment).setOnPlaceSelectedListener(
            new PlaceSelectionListener() {
                @Override
                public void onPlaceSelected(Place place) {
                    // set place variables here
                }

                @Override
                public void onError(Status status) {
                    Log.i("OnPlaceSelected", "An error occurred: " + status);
                }
            }
    );
}


@Override
public void onDetach() {
    super.onDetach();
    mListener = null;
}


public interface OnFragmentInteractionListener {
    // methods here
}

}

將以下代碼移到onCreateview內的placeAutocompleteFragment

我已經用view替換了placeAutocompleteFragment.getView()

EditText etPlace = (EditText) view.findViewById(R.id.place_autocomplete_search_input);
etPlace.setHint("Type your address");

在第一個代碼段中,您使用了:

EditText etPlace = (EditText) placeAutocompleteFragment.getView().findViewById(R.id.place_autocomplete_search_input);

但是在第二個片段中,您使用了

EditText etPlace = (EditText) rootView.findViewById(R.id.place_autocomplete_search_input);

您可以調試並確保您的etPlace編輯文本不為空嗎?

使用SupportPlaceAutocompleteFragment時,應實現AppCompatActivity活動(或FragmentActivity並使用getSupportFragmentManager() )以到達您的片段。

對於第二個選項,您可以創建一個PlaceAutoCompleteFragment而不是SupportPlaceAutoCompleteFragment

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM