2011-03-07 82 views
0

我試圖添加一個textview到線性佈局程序,但我不斷得到我的線性佈局空指針。它在佈局膨脹後被調用,所以我不明白爲什麼它會發生。繼承人的代碼。空指針點addView

tile_layout.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
android:id="@+id/master" 
android:orientation="horizontal"  
android:layout_width="fill_parent" 
android:layout_height="match_parent"> 
<TextView 
android:id="@+id/fragment_two_directory" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:text="Testing Fragment Two" /> 



</LinearLayout> 

fragment_two.java

public class fragment_two extends Fragment { 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    return inflater.inflate(R.layout.tile_layout,container, false); 
} 

public static fragment_two newInstance(String directory, Activity activity) { 
    fragment_two ft = new fragment_two(); 
    TextView text = (TextView)activity.findViewById(R.id.fragment_two_directory); 
    text.setText(directory); 
    return ft; 
} 
public static void setDirectoryText(String directory, Activity activity) { 
    TextView directoryText = (TextView)activity.findViewById(R.id.fragment_two_directory); 
    directoryText.setText(directory); 
    populateDirectory(directory, activity); 
} 
public static void populateDirectory(String directory, Activity activity) { 
    LinearLayout masterLinear = (LinearLayout)activity.findViewById(R.id.master); 
    TextView testText = new TextView(activity); 
    testText.setText("test"); 
    masterLinear.addView(testText); 
    //testText.setText("Testing Add View"); 
    //for (int x=0; x < 5; x++) { 
     //FrameLayout container = new FrameLayout(getActivity()); 
     //container.setLayoutParams(new FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 
     //ImageView fileImage = new ImageView(getActivity()); 
     //fileImage.setLayoutParams(new FrameLayout.LayoutParams(110, 110)); 
     //fileImage.setImageResource(R.drawable.blank_file); 
     //container.addView(fileImage); 
     //TextView fileName = new TextView(getActivity()); 
     //fileName.setLayoutParams(new FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 
     //fileName.setText("Filename.txt"); 
     //container.addView(fileName); 
     //masterLinear.addView(container); 
    //} 

} 
} 

最後是這裏的主要活動

package com.bv.dual_fragments; 

import com.bv.dual_fragments.fragment_one.OnArticleSelectedListener; 

import android.app.Activity; 
import android.net.Uri; 
import android.os.Bundle; 
import android.widget.TextView; 

    public class dual_fragments extends Activity implements OnArticleSelectedListener { 
    /** Called when the activity is first created. */ 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.test); 
     //((global_holder)this.getApplication()).setDirectory("test"); 

    } 
    @Override 
    public void onArticleSelected(String directory) { 
     //fragment_two frag_two = (fragment_two)getFragmentManager().findFragmentById(R.id.container); 
     //TextView containerText = (TextView)findViewById(R.id.fragment_two_directory); 
     //containerText.setText(directory); 
     fragment_two.populateDirectory(directory, this); 
    } 
} 

繼承人的logcat的

03-06 17:35:47.452: ERROR/AndroidRuntime(3576): FATAL EXCEPTION: main 
03-06 17:35:47.452: ERROR/AndroidRuntime(3576): java.lang.NullPointerException 
03-06 17:35:47.452: ERROR/AndroidRuntime(3576):  at  com.bv.dual_fragments.fragment_two.populateDirectory(fragment_two.java:36) 
03-06 17:35:47.452: ERROR/AndroidRuntime(3576):  at com.bv.dual_fragments.dual_fragments.onArticleSelected(dual_fragments.java:25) 
03-06 17:35:47.452: ERROR/AndroidRuntime(3576):  at com.bv.dual_fragments.fragment_one.onListItemClick(fragment_one.java:88) 
03-06 17:35:47.452: ERROR/AndroidRuntime(3576):  at android.app.ListFragment$2.onItemClick(ListFragment.java:160) 
03-06 17:35:47.452: ERROR/AndroidRuntime(3576):  at android.widget.AdapterView.performItemClick(AdapterView.java:282) 
03-06 17:35:47.452: ERROR/AndroidRuntime(3576):  at android.widget.AbsListView.performItemClick(AbsListView.java:1032) 
03-06 17:35:47.452: ERROR/AndroidRuntime(3576):  at android.widget.AbsListView$PerformClick.run(AbsListView.java:2447) 
03-06 17:35:47.452: ERROR/AndroidRuntime(3576):  at android.widget.AbsListView.onTouchEvent(AbsListView.java:3077) 
03-06 17:35:47.452: ERROR/AndroidRuntime(3576):  at android.widget.ListView.onTouchEvent(ListView.java:3566) 
03-06 17:35:47.452: ERROR/AndroidRuntime(3576):  at android.view.View.dispatchTouchEvent(View.java:4600) 
03-06 17:35:47.452: ERROR/AndroidRuntime(3576):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1488) 
03-06 17:35:47.452: ERROR/AndroidRuntime(3576):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1256) 
03-06 17:35:47.452: ERROR/AndroidRuntime(3576):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1494) 
03-06 17:35:47.452: ERROR/AndroidRuntime(3576):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1269) 
03-06 17:35:47.452: ERROR/AndroidRuntime(3576):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1494) 
03-06 17:35:47.452: ERROR/AndroidRuntime(3576):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1269) 
03-06 17:35:47.452: ERROR/AndroidRuntime(3576):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1494) 
03-06 17:35:47.452: ERROR/AndroidRuntime(3576):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1269) 
03-06 17:35:47.452: ERROR/AndroidRuntime(3576):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1494) 
03-06 17:35:47.452: ERROR/AndroidRuntime(3576):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1269) 
03-06 17:35:47.452: ERROR/AndroidRuntime(3576):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1494) 
03-06 17:35:47.452: ERROR/AndroidRuntime(3576):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1269) 
03-06 17:35:47.452: ERROR/AndroidRuntime(3576):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1494) 
03-06 17:35:47.452: ERROR/AndroidRuntime(3576):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1269) 
03-06 17:35:47.452: ERROR/AndroidRuntime(3576):  at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1700) 
03-06 17:35:47.452: ERROR/AndroidRuntime(3576):  at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1270) 
03-06 17:35:47.452: ERROR/AndroidRuntime(3576):  at android.app.Activity.dispatchTouchEvent(Activity.java:2271) 
03-06 17:35:47.452: ERROR/AndroidRuntime(3576):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1680) 
03-06 17:35:47.452: ERROR/AndroidRuntime(3576):  at android.view.ViewRoot.deliverPointerEvent(ViewRoot.java:2272) 
03-06 17:35:47.452: ERROR/AndroidRuntime(3576):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1958) 
03-06 17:35:47.452: ERROR/AndroidRuntime(3576):  at android.os.Handler.dispatchMessage(Handler.java:99) 
03-06 17:35:47.452: ERROR/AndroidRuntime(3576):  at android.os.Looper.loop(Looper.java:126) 
03-06 17:35:47.452: ERROR/AndroidRuntime(3576):  at android.app.ActivityThread.main(ActivityThread.java:3997) 
03-06 17:35:47.452: ERROR/AndroidRuntime(3576):  at java.lang.reflect.Method.invokeNative(Native Method) 
03-06 17:35:47.452: ERROR/AndroidRuntime(3576):  at java.lang.reflect.Method.invoke(Method.java:491) 
03-06 17:35:47.452: ERROR/AndroidRuntime(3576):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 
03-06 17:35:47.452: ERROR/AndroidRuntime(3576):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 
03-06 17:35:47.452: ERROR/AndroidRuntime(3576):  at dalvik.system.NativeStart.main(Native Method) 

我也在蜂窩模擬器中運行了這個功能,並查看了heirarchy查看器。我在該佈局文件中有兩個線性佈局,並且它們都沒有顯示出來,只有textview。

+0

請發佈整個追溯。 – John 2011-03-07 01:21:52

+0

Theres從DDMS logcat,我認爲這就是你想要的。 – Shaun 2011-03-07 01:34:59

+0

是的,就是這樣。無論如何,其中的一些。它看起來不完整。我沒有看到「由...引起」一行。你確定這就是全部? – John 2011-03-07 01:45:02

回答

1

好的,問題是佈局文件搞砸了,我有兩個線性佈局沿着水平方向,因此水平線不會加載它們,從而給出零點例外。對於任何正在查看Android 3.0的heirarchyviewer的人來說,這個片段(在layoutfile中)會自動獲取第一個佈局標籤的所有權。所以說,你有

<fragment android:id="@+id/viewer" /> 

,並在佈局文件,你有

<LinearLayout android:id="@+id/first_layout" /> 

在層次結構瀏覽器中,LinearLayout中會顯示爲觀衆,不first_layout,因爲犯規有一個默認的佈局片段,它會將其佈局文件中的第一個佈局容器重新標識爲其自己的ID。

+0

這是如何克服的? – 2014-05-13 05:14:09

0

如果您正在嘗試查找R.id.master,您應該將內容視圖設置爲R.id.tile_layout

現在你正在尋找它在test.xml

+0

不,這是一個分散的佈局,意味着不同的片段會調用不同的佈局。活動擴展了一個佈局,實際上其中包含其他佈局。 – Shaun 2011-03-07 02:55:34

0

你確定OnArticleSelected()在OnCreate()之後被調用嗎?如果在調用setContentView(layout)之前調用它,findViewById(id)將返回null。也可以嘗試改變這一行:

fragment_two.populateDirectory(directory, this); 

這樣:

fragment_two.populateDirectory(directory, dual_fragments.this); 

如果出於某種不是活動的其他原因的東西是在它獲得通過將打破東西。我知道在OnClickListener中爲一個按鈕進行調用時,您需要像這樣獨特,但我不熟悉您正在使用的偵聽器,所以我不確定是否有必要。馬修帶來了一個很好的觀點,確保你指向正確的.xml文件。

+0

是的,它是在我點擊不同片段中的東西后才被調用的。我嘗試你的改變,看看是否有效。 這是正確的xml文件。該活動使用test.xml來保存片段。 fragment_two使用tile_layout.xml作爲其佈局。 – Shaun 2011-03-07 02:46:49