为什么我的 Shoutcast 片段应用程序收到致命的 NullPointerException



我有一个问题,我希望有人能够提供帮助。我是Android Studio的新学习者,我正在尝试将活动转换为片段。

已经好几天了,我到处寻找解决方案,但没有运气。有人可以向我解释为什么我在这一行上出现这个致命错误:

.LOG

E/AndroidRuntime: FATAL EXCEPTION: main
              Process: com.support.android.designlibdemo, PID: 23057
              java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ListView.setAdapter(android.widget.ListAdapter)' on a null object reference
                  at com.support.android.designlibdemo.NewFragment.onCreateView(NewFragment.java:82)
                  at android.support.v4.app.Fragment.performCreateView(Fragment.java:2261)
                  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1419)
                  at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1750)
                  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1819)
                  at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:797)
                  at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2590)
                  at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2377)
                  at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2332)
                  at android.support.v4.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:2209)
                  at android.support.v4.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:649)
                  at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:145)
                  at android.support.v4.view.ViewPager.populate(ViewPager.java:1238)
                  at android.support.v4.view.ViewPager.populate(ViewPager.java:1086)
                  at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1616)
                  at android.view.View.measure(View.java:20151)
                  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6330)
                  at android.support.design.widget.CoordinatorLayout.onMeasureChild(CoordinatorLayout.java:719)
                  at android.support.design.widget.HeaderScrollingViewBehavior.onMeasureChild(HeaderScrollingViewBehavior.java:91)
                  at android.support.design.widget.AppBarLayout$ScrollingViewBehavior.onMeasureChild(AppBarLayout.java:1361)
                  at android.support.design.widget.CoordinatorLayout.onMeasure(CoordinatorLayout.java:789)
                  at android.view.View.measure(View.java:20151)
                  at android.support.v4.widget.DrawerLayout.onMeasure(DrawerLayout.java:1060)
                  at android.view.View.measure(View.java:20151)
                  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6330)
                  at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
                  at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:139)
                  at android.view.View.measure(View.java:20151)
                  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6330)
                  at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1464)
                  at android.widget.LinearLayout.measureVertical(LinearLayout.java:747)
                  at android.widget.LinearLayout.onMeasure(LinearLayout.java:629)
                  at android.view.View.measure(View.java:20151)
                  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6330)
                  at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
                  at android.view.View.measure(View.java:20151)
                  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6330)
                  at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1464)
                  at android.widget.LinearLayout.measureVertical(LinearLayout.java:747)
                  at android.widget.LinearLayout.onMeasure(LinearLayout.java:629)
                  at android.view.View.measure(View.java:20151)
                  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6330)
                  at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
                  at com.android.internal.policy.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:3158)
                  at android.view.View.measure(View.java:20151)
                  at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2595)
                  at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1550)
                  at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1842)
                  at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1438)
                  at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7398)
                  at android.view.Choreographer$CallbackRecord.run(Choreographer.java:920)
                at android.view.C

I/进程:发送信号。PID: 23057 SIG: 9应用程序已终止。

爪哇代码

public class NewFragment extends Fragment {

@BindView(R.id.toolbar)
Toolbar toolbar;
@BindView(R.id.playTrigger)
ImageButton trigger;
@BindView(R.id.list_views)
ListView listView;
@BindView(R.id.name)
TextView textView;
@BindView(R.id.sub_player)
View subPlayer;
RadioManager radioManager;
String streamURL;

private Toolbar supportActionBar;


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

    ButterKnife.bind(getActivity());
    setSupportActionBar(toolbar);
    radioManager = RadioManager.with(getContext());
    listView.setAdapter(new ShoutcastListAdapter(this, ShoutcastHelper.retrieveShoutcasts(getContext())));  //This is the ERROR line
    return view;
}


@Override
public void onStart() {
    super.onStart();
    EventBus.getDefault().register(this);
}
@Override
public void onStop() {
    EventBus.getDefault().unregister(this);
    super.onStop();
}
@Override
public void onDestroy() {
    radioManager.unbind();
    super.onDestroy();
}
@Override
public void onResume() {
    super.onResume();
    radioManager.bind();
}

@Subscribe
public void onEvent(String status){
    switch (status){
        case PlaybackStatus.LOADING:
            // loading
            break;
        case PlaybackStatus.ERROR:
            Toast.makeText(getActivity(), R.string.no_stream, Toast.LENGTH_SHORT).show();
            break;
    }
    trigger.setImageResource(status.equals(PlaybackStatus.PLAYING)
            ? R.drawable.ic_pause_black
            : R.drawable.ic_play_arrow_black);
}
@OnClick(R.id.playTrigger)
public void onClicked(){
    if(TextUtils.isEmpty(streamURL)) return;
    radioManager.playOrPause(streamURL);
}

@OnItemClick(R.id.list_views)
public void onItemClick(AdapterView<?> parent, View view, int position, long id){
    Shoutcast shoutcast = (Shoutcast) parent.getItemAtPosition(position);
    if(shoutcast == null){
        return;
    }
    textView.setText(shoutcast.getName());
    subPlayer.setVisibility(View.VISIBLE);
    streamURL = shoutcast.getUrl();
   radioManager.playOrPause(streamURL);
}
public void setSupportActionBar(Toolbar supportActionBar) {
    this.supportActionBar = supportActionBar;
}

}

片段 XML

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout    xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior" >
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <ListView
        android:id="@+id/list_views"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" />
    <RelativeLayout
        android:id="@+id/sub_player"
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:orientation="horizontal"
        android:visibility="gone"
        android:background="@android:color/white">
        <TextView
            android:id="@+id/name"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginLeft="20dp"
            android:layout_alignParentLeft="true"
            android:gravity="center|start"
            android:text="Radio station"
            android:textSize="20sp"/>
        <ImageButton
            android:id="@+id/playTrigger"
            android:layout_width="60dp"
            android:layout_height="match_parent"
            android:layout_marginRight="10dp"
            android:layout_alignParentRight="true"
            android:src="@drawable/ic_play_arrow_black"
            android:background="@null"
            android:backgroundTint="@android:color/transparent"/>
    </RelativeLayout>
</LinearLayout>

旧代码更改为片段这与我更改为片段的代码相同。

public class MainActivity extends AppCompatActivity {
@BindView(R.id.toolbar)
Toolbar toolbar;
@BindView(R.id.playTrigger)
ImageButton trigger;
@BindView(R.id.listview)
ListView listView;
@BindView(R.id.name)
TextView textView;
@BindView(R.id.sub_player)
View subPlayer;
RadioManager radioManager;
String streamURL;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ButterKnife.bind(this);
    setSupportActionBar(toolbar);
    radioManager = RadioManager.with(this);
    listView.setAdapter(new ShoutcastListAdapter(this, ShoutcastHelper.retrieveShoutcasts(this)));
}
@Override
public void onStart() {
    super.onStart();
    EventBus.getDefault().register(this);
}
@Override
public void onStop() {
    EventBus.getDefault().unregister(this);
    super.onStop();
}
@Override
protected void onDestroy() {
    radioManager.unbind();
    super.onDestroy();
}
@Override
protected void onResume() {
    super.onResume();
    radioManager.bind();
}
@Override
public void onBackPressed() {
    finish();
}
@Subscribe
public void onEvent(String status){
    switch (status){
        case PlaybackStatus.LOADING:
            // loading
            break;
        case PlaybackStatus.ERROR:
            Toast.makeText(this, R.string.no_stream, Toast.LENGTH_SHORT).show();
            break;
    }
    trigger.setImageResource(status.equals(PlaybackStatus.PLAYING)
            ? R.drawable.ic_pause_black
            : R.drawable.ic_play_arrow_black);
}
@OnClick(R.id.playTrigger)
public void onClicked(){
    if(TextUtils.isEmpty(streamURL)) return;
    radioManager.playOrPause(streamURL);
}
@OnItemClick(R.id.listview)
public void onItemClick(AdapterView<?> parent, View view, int position, long id){
    Shoutcast shoutcast = (Shoutcast) parent.getItemAtPosition(position);
    if(shoutcast == null){
        return;
    }
    textView.setText(shoutcast.getName());
    subPlayer.setVisibility(View.VISIBLE);
    streamURL = shoutcast.getUrl();
    radioManager.playOrPause(streamURL);
}

}

我真的不确定它为什么要这样做。这是我为当地广播电台做的一个应用程序,我想在片段上有一个播放器。此外,我已经多次仔细检查了我的资源的id,并尝试重命名一些...还是没有运气。请指导我。谢谢。

更改此内容

ButterKnife.bind(getActivity(((;

黄油刀绑定(这个,视图(;

找不到

listView,因为您已将 ButterKnife 与活动非片段绑定。对于片段,您必须使用ButterKnife.bind(this, view)而不是ButterKnife.bind(getActivity())

public class NewFragment extends Fragment{
    // as other code
    @BindView(R.id.listview)
    ListView listView;
    // as other code
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_new, container, false);
        ButterKnife.bind(this, view);
        // other codes
    }
}

相关内容

最新更新