2016-09-01 49 views
-1

我正在开发音乐播放器的片段应用程序。在这里,当我使用代码从XML获取视图时,它停止工作。Android:getview.findviewbyid上的片段错误?

我的XML代码..

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/linearLayoutMusicList" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_gravity="center_horizontal" 
    android:background="@drawable/default_album_art_thumb" 
    android:orientation="vertical" > 

    <ListView 
     android:id="@+id/listViewMusic" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:layout_weight="1" 
     android:background="@android:color/transparent" /> 

    <LinearLayout 
     android:id="@+id/linearLayoutPlayingSong" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:background="@color/transparent" 
     android:gravity="center" 
     android:orientation="vertical" > 

     <View 
      android:layout_width="match_parent" 
      android:layout_height="1dp" 
      android:background="@android:color/darker_gray" /> 

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center_horizontal|bottom" 
      android:orientation="horizontal" > 

      <ImageView 
       android:id="@+id/imageViewAlbumArt" 
       android:layout_width="@dimen/small_image_art_width" 
       android:layout_height="@dimen/small_image_art_width" /> 

      <LinearLayout 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       android:orientation="vertical" > 

       <TextView 
        android:id="@+id/textNowPlaying" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:layout_weight="1" 
        android:ellipsize="marquee" 
        android:gravity="center_horizontal" 
        android:marqueeRepeatLimit="marquee_forever" 
        android:singleLine="true" 
        android:text="@string/empty_text" 
        android:textColor="@color/white" 
        android:textSize="15dp" /> 

       <LinearLayout 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:gravity="center_horizontal" 
        android:orientation="horizontal" > 

        <Button 
         android:id="@+id/btnPrevious" 
         android:layout_width="@dimen/small_button_width" 
         android:layout_height="@dimen/small_button_width" 
         android:layout_gravity="center_vertical" 
         android:layout_marginLeft="10dp" 
         android:layout_marginRight="10dp" 
         android:background="@drawable/ic_action_previous" /> 

        <Button 
         android:id="@+id/btnPlay" 
         android:layout_width="@dimen/small_button_width" 
         android:layout_height="@dimen/small_button_width" 
         android:layout_gravity="center_vertical" 
         android:layout_marginLeft="10dp" 
         android:layout_marginRight="10dp" 
         android:background="@drawable/ic_action_play" 
         android:visibility="gone" /> 

        <Button 
         android:id="@+id/btnPause" 
         android:layout_width="@dimen/small_button_width" 
         android:layout_height="@dimen/small_button_width" 
         android:layout_gravity="center_vertical" 
         android:layout_marginLeft="10dp" 
         android:layout_marginRight="10dp" 
         android:background="@drawable/ic_action_pause" /> 

        <Button 
         android:id="@+id/btnStop" 
         android:layout_width="@dimen/small_button_width" 
         android:layout_height="@dimen/small_button_width" 
         android:layout_gravity="center_vertical" 
         android:layout_marginLeft="10dp" 
         android:layout_marginRight="10dp" 
         android:background="@drawable/ic_action_stop" /> 

        <Button 
         android:id="@+id/btnNext" 
         android:layout_width="@dimen/small_button_width" 
         android:layout_height="@dimen/small_button_width" 
         android:layout_gravity="center_vertical" 
         android:layout_marginLeft="10dp" 
         android:layout_marginRight="10dp" 
         android:background="@drawable/ic_action_next" /> 

        <Button 
         android:id="@+id/btnMusicPlayer" 
         android:layout_width="@dimen/small_button_width" 
         android:layout_height="@dimen/small_button_width" 
         android:layout_gravity="center_vertical" 
         android:layout_marginLeft="10dp" 
         android:layout_marginRight="10dp" 
         android:background="@drawable/ic_music" /> 
       </LinearLayout> 

       <LinearLayout 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:layout_marginLeft="10dp" 
        android:layout_marginRight="10dp" 
        android:orientation="horizontal" > 

        <TextView 
         android:id="@+id/textBufferDuration" 
         android:layout_width="wrap_content" 
         android:layout_height="wrap_content" 
         android:layout_weight="1" 
         android:textColor="@color/white" /> 

        <TextView 
         android:id="@+id/textDuration" 
         android:layout_width="wrap_content" 
         android:layout_height="wrap_content" 
         android:layout_gravity="right" 
         android:textColor="@color/white" /> 
       </LinearLayout> 

       <ProgressBar 
        android:id="@+id/progressBar" 
        style="?android:attr/progressBarStyleHorizontal" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:layout_marginBottom="1dp" 
        android:layout_marginLeft="10dp" 
        android:layout_marginRight="10dp" /> 
      </LinearLayout> 
     </LinearLayout> 
    </LinearLayout> 

</LinearLayout> 

片段代码..

public class Device_Main extends Fragment { 

    Device_CustomAdapter deviceCustomAdapter = null; 
    static TextView playingSong; 
    Button btnPlayer; 
    static Button btnPause, btnPlay, btnNext, btnPrevious; 
    Button btnStop; 
    LinearLayout mediaLayout; 
    static LinearLayout linearLayoutPlayingSong; 
    ListView mediaListView; 
    ProgressBar progressBar; 
    TextView textBufferDuration, textDuration; 
    static ImageView imageViewAlbumArt; 
    static Context context; 
    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     final View view = inflater.inflate(R.layout.device_activity_main, container, false); 



     context = Device_Main.this.getActivity(); 
     init(); 

     //<--------------------------------------------------->>>>>>>>>>>>>. 
     return view; 
    } 


    private void init() { 
     getViews(); 
     setListeners(); 
     playingSong.setSelected(true); 
     progressBar.getProgressDrawable().setColorFilter(getResources().getColor(R.color.orange), PorterDuff.Mode.SRC_IN); 
     if(Device_PlayerConstants.SONGS_LIST.size() <= 0){ 
      Device_PlayerConstants.SONGS_LIST = Device_UtilFunctions.listOfSongs(getActivity().getApplicationContext()); 
     } 
     setListItems(); 
    } 

    private void setListItems() { 
     deviceCustomAdapter = new Device_CustomAdapter(this,R.layout.device_custom_list, Device_PlayerConstants.SONGS_LIST); 
     mediaListView.setAdapter(deviceCustomAdapter); 
     mediaListView.setFastScrollEnabled(true); 
    } 

    private void getViews() { 
     playingSong = (TextView) getView().findViewById(R.id.textNowPlaying); 
     btnPlayer = (Button) getView().findViewById(R.id.btnMusicPlayer); 
     mediaListView = (ListView) getView().findViewById(R.id.listViewMusic); 
     mediaLayout = (LinearLayout) getView().findViewById(R.id.linearLayoutMusicList); 
     btnPause = (Button) getView().findViewById(R.id.btnPause); 
     btnPlay = (Button) getView().findViewById(R.id.btnPlay); 
     linearLayoutPlayingSong = (LinearLayout) getView().findViewById(R.id.linearLayoutPlayingSong); 
     progressBar = (ProgressBar) getView().findViewById(R.id.progressBar); 
     btnStop = (Button) getView().findViewById(R.id.btnStop); 
     textBufferDuration = (TextView) getView().findViewById(R.id.textBufferDuration); 
     textDuration = (TextView) getView().findViewById(R.id.textDuration); 
     imageViewAlbumArt = (ImageView) getView().findViewById(R.id.imageViewAlbumArt); 
     btnNext = (Button) getView().findViewById(R.id.btnNext); 
     btnPrevious = (Button) getView().findViewById(R.id.btnPrevious); 
    } 

    private void setListeners() { 
     mediaListView.setOnItemClickListener(new AdapterView.OnItemClickListener(){ 
      @Override 
      public void onItemClick(AdapterView<?> parent, View item, int position, long id){ 
       Log.d("TAG", "TAG Tapped INOUT(IN)"); 
       Device_PlayerConstants.SONG_PAUSED = false; 
       Device_PlayerConstants.SONG_NUMBER = position; 
       boolean isServiceRunning = Device_UtilFunctions.isServiceRunning(Device_SongService.class.getName(), getActivity().getApplicationContext()); 
       if (!isServiceRunning) { 
        Intent i = new Intent(getActivity().getApplicationContext(),Device_SongService.class); 
        context.startService(i); 
       } else { 
        Device_PlayerConstants.SONG_CHANGE_HANDLER.sendMessage(Device_PlayerConstants.SONG_CHANGE_HANDLER.obtainMessage()); 
       } 
       updateUI(); 
       changeButton(); 
       Log.d("TAG", "TAG Tapped INOUT(OUT)"); 
      } 
     }); 

     btnPlayer.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Intent i = new Intent(Device_Main.this.getActivity(),Device_AudioPlayerActivity.class); 
       startActivity(i); 
      } 
     }); 
     btnPlay.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Device_Controls.playControl(getActivity().getApplicationContext()); 
      } 
     }); 
     btnPause.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Device_Controls.pauseControl(getActivity().getApplicationContext()); 
      } 
     }); 
     btnNext.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       Device_Controls.nextControl(getActivity().getApplicationContext()); 
      } 
     }); 
     btnPrevious.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       Device_Controls.previousControl(getActivity().getApplicationContext()); 
      } 
     }); 
     btnStop.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Intent i = new Intent(getActivity().getApplicationContext(), Device_SongService.class); 
       context.stopService(i); 
       linearLayoutPlayingSong.setVisibility(View.GONE); 
      } 
     }); 
     imageViewAlbumArt.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       Intent i = new Intent(Device_Main.this.getActivity(),Device_AudioPlayerActivity.class); 
       startActivity(i); 
      } 
     }); 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
     try{ 
      boolean isServiceRunning = Device_UtilFunctions.isServiceRunning(Device_SongService.class.getName(), getActivity().getApplicationContext()); 
      if (isServiceRunning) { 
       updateUI(); 
      }else{ 
       linearLayoutPlayingSong.setVisibility(View.GONE); 
      } 
      changeButton(); 
      Device_PlayerConstants.PROGRESSBAR_HANDLER = new Handler(){ 
       @Override 
       public void handleMessage(Message msg){ 
        Integer i[] = (Integer[])msg.obj; 
        textBufferDuration.setText(Device_UtilFunctions.getDuration(i[0])); 
        textDuration.setText(Device_UtilFunctions.getDuration(i[1])); 
        progressBar.setProgress(i[2]); 
       } 
      }; 
     }catch(Exception e){} 
    } 

    @SuppressWarnings("deprecation") 
    public static void updateUI() { 
     try{ 
      Device_MediaItem data = Device_PlayerConstants.SONGS_LIST.get(Device_PlayerConstants.SONG_NUMBER); 
      playingSong.setText(data.getTitle() + " " + data.getArtist() + "-" + data.getAlbum()); 
      Bitmap albumArt = Device_UtilFunctions.getAlbumart(context, data.getAlbumId()); 
      if(albumArt != null){ 
       imageViewAlbumArt.setBackgroundDrawable(new BitmapDrawable(albumArt)); 
      }else{ 
       imageViewAlbumArt.setBackgroundDrawable(new BitmapDrawable(Device_UtilFunctions.getDefaultAlbumArt(context))); 
      } 
      linearLayoutPlayingSong.setVisibility(View.VISIBLE); 
     }catch(Exception e){} 
    } 

    public static void changeButton() { 
     if(Device_PlayerConstants.SONG_PAUSED){ 
      btnPause.setVisibility(View.GONE); 
      btnPlay.setVisibility(View.VISIBLE); 
     }else{ 
      btnPause.setVisibility(View.VISIBLE); 
      btnPlay.setVisibility(View.GONE); 
     } 
    } 

    public static void changeUI(){ 
     updateUI(); 
     changeButton(); 
    } 



} 

登录卡特(Catt)是..

java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference 
                        at com.example.jithin.myapplication.Device_Main.getViews(Device_Main.java:83) 
                        at com.example.jithin.myapplication.Device_Main.init(Device_Main.java:66) 
                        at com.example.jithin.myapplication.Device_Main.onCreateView(Device_Main.java:58) 
                        at android.support.v4.app.Fragment.performCreateView(Fragment.java:1974) 
                        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067) 
                        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1252) 
                        at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:742) 
                        at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1617) 
                        at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:570) 
                        at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141) 
                        at android.support.v4.view.ViewPager.populate(ViewPager.java:1177) 
                        at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:608) 
                        at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:570) 
                        at android.support.v4.view.ViewPager.setCurrentItem(ViewPager.java:551) 
                        at android.support.design.widget.TabLayout$ViewPagerOnTabSelectedListener.onTabSelected(TabLayout.java:2008) 
                        at android.support.design.widget.TabLayout.selectTab(TabLayout.java:1025) 
                        at android.support.design.widget.TabLayout.selectTab(TabLayout.java:995) 
                        at android.support.design.widget.TabLayout$Tab.select(TabLayout.java:1272) 
                        at android.support.design.widget.TabLayout$TabView.performClick(TabLayout.java:1377) 
                        at android.view.View$PerformClick.run(View.java:21147) 
                        at android.os.Handler.handleCallback(Handler.java:739) 
                        at android.os.Handler.dispatchMessage(Handler.java:95) 

谁能帮我找到这个sollution错误..谢谢......

+0

将findviewByID放在view的view.findViewById();在OncreateView方法 –

回答

1

您的片段getView()方法将为null,因为OnCreate上的视图在初始化这些视图之前未返回到活动状态。

首先将视图对象传递给init函数。

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     final View view = inflater.inflate(R.layout.device_activity_main, container, false); 
     context = Device_Main.this.getActivity(); 
     init(view); 
     return view; 
    } 

现在通过视图对象getViews()方法初始化函数

private void init(View view) { 
     getViews(view); 
     setListeners(); 
     playingSong.setSelected(true); 
     progressBar.getProgressDrawable().setColorFilter(getResources().getColor(R.color.orange), PorterDuff.Mode.SRC_IN); 
     if(Device_PlayerConstants.SONGS_LIST.size() <= 0){ 
      Device_PlayerConstants.SONGS_LIST = Device_UtilFunctions.listOfSongs(getActivity().getApplicationContext()); 
     } 
     setListItems(); 
    } 

现在使用的视图对象使用findViewById()

private void getViews(View view) { 
     playingSong = (TextView) view.findViewById(R.id.textNowPlaying); 
     btnPlayer = (Button) view.findViewById(R.id.btnMusicPlayer); 
+0

谢谢你工作.. –

3

在创建View之前,您正在调用getView()方法。在onViewCreated()中移动init()方法。

1

getView()保持null直到你return view;在您的onCreateView() ,因为您做init();,其中调用getViews();,它在return view;之前调用getView(),它将产生NPE。
解可以是例如该线

context = Device_Main.this.getActivity(); 
init(); 

移入onActivityCreated()

1

通过以init()方法(例如:INIT(视图)),并从那里通到getViews()方法(实施例:getViews(view))。

使用,在getViews()代码视图,

playingSong = (TextView) view.findViewById(R.id.textNowPlaying); 
1

要调用从onCreateView(的init()),而onCreateView()必须只包含代码膨胀视图布局片段。到此时,getView()方法将返回null,因为它未被初始化。

您必须将所有初始化代码(init())移至片段生命周期中稍后调用的方法,即onActivityCreated()。

参考:https://developer.android.com/guide/components/fragments.html的片段生命周期。