2017-05-18 81 views
1

我想通過程序(無XML包含方式)添加一個我在外部XML中創建的RelativeLayout,它是通過外部函數設置的。將XML對象傳遞給外部函數(Android)

的錯誤是:

FATAL EXCEPTION: main 
Process: ucam, PID: 8950 
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.View.setId(int)' on a null object reference 
at ucam.misc.MessageSetter.setMessageInfo(MessageSetter.java:51) 
at ucam.activities.MainBoard$3$1.onSuccess(MainBoard.java:133) 
at ucam.misc.RequestManager$1.onResponse(RequestManager.java:58) 
at ucam.misc.RequestManager$1.onResponse(RequestManager.java:43)         
at com.android.volley.toolbox.JsonRequest.deliverResponse(JsonRequest.java:65) 
at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:99) 
at android.os.Handler.handleCallback(Handler.java:751) 
at android.os.Handler.dispatchMessage(Handler.java:95) 
at android.os.Looper.loop(Looper.java:154) 
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) 

下面是mainactivity.java代碼:

private Message m; 
private List<Message> ml; 
private TextView textBox, dateBox, likesBox, textTitle; 
private ImageButton likeButton; 
private LinearLayout content, main; 
private RelativeLayout news; 
private MessageSetter msetter; 
private RequestManager rmanager; 


@Override 
    protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main_board); 

     news = (RelativeLayout) findViewById(R.id.news_template); 

(...)

@Override 
     public boolean onNavigationItemSelected(@NonNull MenuItem item) { 
      switch (item.getItemId()) { 
       case R.id.navigation_recents: 
        rmanager.getRecentMessages(new VolleyCallbackOp() { 

         public void onSuccess(List<Message> ml) { 
          for (int a = 0; a < ml.size(); a++) { 

           Message j = ml.get(a); 
           msetter = new MessageSetter(MainBoard.this); 
           View v = msetter.setMessageInfo(j, a); 



           }); 

           content.addView(v); 
          } 
         } 
        }); 

這裏的外部設定裝置類:

public class MessageSetter { 
    public Activity mainBoard; 
    private TextView textBox, dateBox, likesBox, textTitle; 
    private ImageButton likeButton; 
    private RelativeLayout news; 



    public MessageSetter(Activity mainBoard) { 
     this.mainBoard = mainBoard; 
     this.news = (RelativeLayout) this.mainBoard.findViewById(R.id.news_template); 
     this.textBox = (TextView) this.mainBoard.findViewById(R.id.text_box); 
     this.dateBox = (TextView) this.mainBoard.findViewById(R.id.date_box); 
     this.likesBox = (TextView) this.mainBoard.findViewById(R.id.likes_box); 
     this.textTitle = (TextView) this.mainBoard.findViewById(R.id.text_title); 

    } 

    public View setMessageInfo(Message j, int a) { 
     int idDB = a; 
     int idLB = a; 
     int idLBT = a; 
     textTitle.setId(a); 
     textTitle.setText(j.getTitle()); 
     textBox.setText(j.getContent()); 
     textBox.setId((j.getId())); 
     dateBox.setText(String.valueOf(j.getDate())); 
     dateBox.setId(idDB); 
     likesBox.setText(String.valueOf(j.getLikesCount())); 
     likesBox.setId(idLB); 

return news; 
    } 

這是在MainActivity佈局:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v4.widget.DrawerLayout 
    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:id="@+id/drawer_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true" 
    tools:context=".activities.MainBoard" 
    tools:openDrawer="start"> 



<ScrollView 
    android:id="@+id/main_scroll" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 

    <LinearLayout 

     android:id="@+id/main_linear" 
     android:orientation="vertical" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"> 
     <include layout="@layout/app_bar_main_board" /> 

     <LinearLayout 
      android:id="@+id/main_content" 
      android:orientation="vertical" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content"> 

     </LinearLayout> 


    </LinearLayout> 

</ScrollView> 

    <android.support.design.widget.CoordinatorLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

     <android.support.design.widget.BottomNavigationView 
      android:id="@+id/navigation" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_gravity="bottom" 
      android:background="?android:attr/windowBackground" 
      app:menu="@menu/navigation" /> 

     <android.support.design.widget.FloatingActionButton 
      android:id="@+id/fab" 
      android:layout_width="wrap_content" 
      android:layout_height="72dp" 
      android:layout_gravity="center|end" 
      android:layout_margin="@dimen/fab_margin" 
      app:srcCompat="@drawable/ic_comment_black_24dp" /> 

    </android.support.design.widget.CoordinatorLayout> 

    <android.support.design.widget.NavigationView 

     android:id="@+id/nav_view" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:layout_gravity="start" 
     app:headerLayout="@layout/nav_header_main_board" 
     app:menu="@menu/activity_main_board_drawer" > 

    </android.support.design.widget.NavigationView> 


</android.support.v4.widget.DrawerLayout> 

最後,這是XML外部佈局文件我想設置和活動包括:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_marginTop="3dp" 
    android:layout_marginRight="3dp" 
    android:layout_marginLeft="3dp" 
    android:id="@+id/news_template" 
    android:layout_width="match_parent" 
    android:layout_height="120dp" 
    android:background="#5A8FF2" 
    android:orientation="horizontal" 
    tools:context=".activities.MainBoard"> 

    <TextView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:padding="2dp" 
     android:id="@+id/text_title" 
     android:textColor="#000000" 
     android:textStyle="normal" 
     android:textSize="14dp" 
     android:gravity="center" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" /> 
    <TextView 
     android:id="@+id/text_box" 
     android:textColor="#000000" 
     android:textStyle="normal" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textSize="14dp" 
     android:padding="10dp" 
     android:layout_above="@+id/news_answers" 
     android:layout_below="@+id/text_title" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentEnd="true"> 
    </TextView> 

    <LinearLayout 
     android:id="@+id/news_answers" 
     android:layout_width="20dp" 
     android:layout_height="20dp" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentLeft="true" 
     android:layout_marginBottom="15dp" 
     android:layout_marginLeft="25dp" 
     android:orientation="horizontal"> 

    </LinearLayout> 

    <LinearLayout 
     android:id="@+id/news_likes" 
     android:layout_marginRight="8dp" 
     android:layout_width="120dp" 
     android:layout_height="match_parent" 
     android:layout_alignParentBottom="true" 
     android:layout_alignTop="@+id/imageView2" 
     android:gravity="right" 
     android:orientation="vertical" 
     android:weightSum="2" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentEnd="true"> 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="0dp" 
      android:layout_weight="1" 
      android:textSize="12dp" 
      android:text="Likes" /> 

     <TextView 
      android:id="@+id/likes_box" 
      android:textSize="12dp" 
      android:layout_width="wrap_content" 
      android:layout_height="0dp" 
      android:layout_weight="1" /> 
    </LinearLayout> 

    <ImageButton 
     android:id="@+id/like_button" 
     android:layout_width="26dp" 
     android:layout_height="26dp" 
     android:layout_alignParentBottom="true" 
     android:layout_centerHorizontal="true" 
     android:background="@drawable/ic_mood_black_24dp" 
     android:text="Like" /> 

    <LinearLayout 
     android:id="@+id/imageView2" 
     android:layout_marginLeft="8dp" 
     android:layout_width="120dp" 
     android:layout_height="match_parent" 
     android:layout_alignParentBottom="true" 
     android:layout_alignTop="@+id/news_answers" 
     android:orientation="vertical" 
     android:weightSum="2"> 

     <TextView 
      android:layout_width="wrap_content" 
      android:textSize="12dp" 
      android:layout_height="0dp" 
      android:layout_weight="1" 
      android:text="Date" /> 

     <TextView 
      android:id="@+id/date_box" 
      android:textSize="12dp" 
      android:layout_width="wrap_content" 
      android:layout_height="0dp" 
      android:layout_weight="1" /> 
    </LinearLayout> 

</RelativeLayout> 

我不明白爲什麼setfunction返回空引用。

+0

我想因爲RelativeLayout不在你的mainActivity佈局中,它會拋出null對象異常。 –

回答

1

發生這種情況的原因是您以錯誤的方式使用findViewById()

this.news = (RelativeLayout) this.mainBoard.findViewById(R.id.news_template); 
this.textBox = (TextView) this.mainBoard.findViewById(R.id.text_box); 
this.dateBox = (TextView) this.mainBoard.findViewById(R.id.date_box); 
this.likesBox = (TextView) this.mainBoard.findViewById(R.id.likes_box); 
this.textTitle = (TextView) this.mainBoard.findViewById(R.id.text_title); 

所有這些方法的調用返回null,因爲這些觀點並非位於你的活動佈局 - R.layout.activity_main_board,你反而在此處設置setContentView(R.layout.activity_main_board);

,你應該使用sepertly誇大你的XML佈局,他們找到的意見從這個XML。 結算這一代碼:

//get the inflater from your activity 
LayoutInflater inflater = mainBoard.getLayoutInflater(); 
//get the root view, this is the view that should be the parent of the new inflated view 
View root = this.mainBoard.findViewById(R.id.main_content); 
//false indicates that the new inflated view wont be attatched to its parent. Use true if this is not your wanted behavior 
this.news = (RelativeLayout) = inflater.inflate(R.layout.news_template, (ViewGroup) root,false); 
//find the views from the inflated xml 
this.textBox = (TextView) news.findViewById(R.id.text_box); 
this.dateBox = (TextView) news.findViewById(R.id.date_box); 
this.likesBox = (TextView) news.findViewById(R.id.likes_box); 
this.textTitle = (TextView) news.findViewById(R.id.text_title); 
+0

我會試試這個,我會讓你知道..謝謝你的建議;) – firstofthebadones

+0

讓我知道如果這不能幫助你:D –

+1

確定它完美的作品!非常感謝你!! (只需要一個鑄件: this.news =(RelativeLayout)inflater.inflate(R.layout.news_template,(ViewGroup)root,false); – firstofthebadones