在传输过程中,我的新片段实例的视图为无效.如何设置数据



我遇到以下问题时正在学习Android。

我想创建一个简单的应用程序,可以显示我通过FragmentsManager在片段之间切换。为此,我有一个活动,其中包含两个片段,一个包含项目的列表视图的片段,以及一个带有图像的项目名称的详细信息。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<fragment
    android:id="@+id/overviewFragment"
    class="com.example.richard.myfragmentapp.OverviewFragment"
    android:layout_width="0px"
    android:layout_height="match_parent"
    android:layout_weight="1"
    tools:layout="@layout/overview_fragment" />
<fragment
    android:id="@+id/detailFragment"
    class="com.example.richard.myfragmentapp.DetailFragment"
    android:layout_width="0px"
    android:layout_height="match_parent"
    android:layout_weight="1"
    tools:layout="@layout/detail_fragment" />
</LinearLayout>

启动应用程序时,显示的第一个片段是概述片段,显示了listView。当我从列表中选择一个项目时,事件侦听器触发并创建一个片段的实例,该实例应替换片段

public class MainActivity extends AppCompatActivity implements   OverviewFragment.OnItemSelectedListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //setContentView(R.layout.activity_main);
    setContentView(R.layout.overview_fragment_portrait);
}
@Override
public void onItemSelected(String item) {
    DetailFragment fragment = new DetailFragment(); 
    fragment.setPokemon(item);
    FragmentManager manager = getFragmentManager();
    FragmentTransaction transaction = manager.beginTransaction();
    transaction.replace(R.id.overviewFragment, fragment); 
    transaction.commit();
}

}

但是,在此过程中,当选定的数据传递给实例化详细信息时,我的应用程序崩溃并通知我以下消息:

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

细节范围看起来像这样:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    return inflater.inflate(R.layout.detail_fragment, container, false);
}
public void setPokemon(String name) {
    TextView textview = (TextView) getView().findViewById(R.id.textView);
    textview.setText(name);
    ImageView imageview = (ImageView) getView().findViewById(R.id.imageView);
    switch (name) {
        case "Bulbasaur":
            imageview.setImageResource(R.drawable.bulbasaur);
            break;
        case "Dragonite":
            imageview.setImageResource(R.drawable.dragonite);
            break;
        case "Pikachu":
            imageview.setImageResource(R.drawable.pikachu);
            break;
    }
}

当我的观点以详细范围的布局存在时,为什么它们的观点为无效?我希望有一个人可以帮助我。

编辑:添加stacktrace

D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: com.example.richard.myfragmentapp, PID: 9113
                  java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference
                      at com.example.richard.myfragmentapp.DetailFragment.setPokemon(DetailFragment.java:26)
                      at com.example.richard.myfragmentapp.MainActivity.onItemSelected(MainActivity.java:21)
                      at com.example.richard.myfragmentapp.OverviewFragment$1.onItemClick(OverviewFragment.java:39)
                      at android.widget.AdapterView.performItemClick(AdapterView.java:310)
                      at android.widget.AbsListView.performItemClick(AbsListView.java:1156)
                      at android.widget.AbsListView$PerformClick.run(AbsListView.java:3121)
                      at android.widget.AbsListView.onTouchUp(AbsListView.java:4048)
                      at android.widget.AbsListView.onTouchEvent(AbsListView.java:3807)
                      at android.view.View.dispatchTouchEvent(View.java:10023)
                      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2626)
                      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2307)
                      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2632)
                      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2321)
                      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2632)
                      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2321)
                      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2632)
                      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2321)
                      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2632)
                      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2321)
                      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2632)
                      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2321)
                      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2632)
                      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2321)
                      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2632)
                      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2321)
                      at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:413)
                      at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1808)
                      at android.app.Activity.dispatchTouchEvent(Activity.java:3061)
                      at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:71)
                      at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:375)
                      at android.view.View.dispatchPointerEvent(View.java:10243)
                      at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4438)
                      at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4306)
                      at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3853)
                      at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3906)
                      at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3872)
                      at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3999)
                      at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3880)
                      at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4056)
                      at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3853)
                      at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3906)
                      at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3872)
                      at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3880)
                      at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3853)
                      at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:6246)
                      at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:6220)
                      at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6181)
                      at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:6349)
                      at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
                      at android.os.MessageQueue.nativePollOnce(Native Method)
E/AndroidRuntime:     at android.os.MessageQueue.next(MessageQueue.java:323)
                      at android.os.Looper.loop(Looper.java:136)
                      at android.app.ActivityThread.main(ActivityThread.java:6119)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

DetailFragment

中使用以下代码
public static DetailFragment newInstance(String name) {
    DetailFragment fragment = new DetailFragment();
    Bundle args = new Bundle();
    args.putString("KEY_NAME", name);
    fragment.setArguments(args);
    return fragment;
}
void onViewCreated (View view, 
                Bundle savedInstanceState) {
  Bundle bundle = getArguments();
  if(bundle != null) {
      String name = bundle.getString("KEY_NAME");
      setPokemon(name);
  }
}

并使用此 -

更新您的onItemSelected
DetailFragment fragment = DetailFragment.newInstance(name); 
FragmentManager manager = getFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.replace(R.id.overviewFragment, fragment); 
transaction.commit();

也读取片段指南。

最新更新