2011-03-07 50 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