нулевая точка указателя addView - PullRequest
0 голосов
/ 07 марта 2011

Я пытаюсь добавить текстовое представление к линейному макету программно, но я продолжаю получать нулевой указатель на мой линейный макет. Его называют после того, как макет надут, поэтому я не понимаю, почему это происходит. Вот код.

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)

Я также запустил это в эмуляторе сота и посмотрел на средство просмотра иерархии. У меня есть два линейных макета внутри этого файла макета, и ни один из них не отображается, только текстовое представление.

Ответы [ 3 ]

1 голос
/ 07 марта 2011

Хорошо, проблема была в том, что файл макета был испорчен, и у меня было два линейных макета, идущих горизонтально, и поэтому иерархия не загружала их, давая исключение нулевой точки. Просто совет для тех, кто смотрит на heirarchyviewer для Android 3.0, фрагмент (внутри файла макета) автоматически получит право собственности на первый тег макета в его раздутом виде. Скажем, у вас есть

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

и в вашем файле макета у вас есть

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

В средстве просмотра heirarchy LinearLayout будет отображаться как средство просмотра, а не first_layout, так как фрагмент не имеет макета по умолчанию, он собирается переопределить первый контейнер макета в своем файле макета с его собственным идентификатором.

0 голосов
/ 07 марта 2011

Вы уверены, что OnArticleSelected () вызывается после OnCreate ()? findViewById (id) вернет null, если он вызывается до вызова setContentView (layout). Также попробуйте изменить эту строку:

fragment_two.populateDirectory(directory, this);

к этому:

fragment_two.populateDirectory(directory, dual_fragments.this);

Если по какой-то причине в него передается что-то другое, чем действие, оно сломает вещи. Я знаю, что вы должны быть такими, как это, когда делаете вызов изнутри OnClickListener для кнопки, но я не знаком с слушателем, который вы используете, поэтому я не уверен, будет ли это необходимо. И Мэттью дает хорошее замечание, чтобы убедиться, что вы указываете на правильный файл .xml.

0 голосов
/ 07 марта 2011

Если вы устанавливаете представление содержимого на R.id.tile_layout, если вы пытаетесь найти R.id.master?

Сейчас вы ищете его в test.xml.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...