textView setText() NullPointerException

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

Я также попытался создать экземпляр textView вне onCreate() на уровне класса, и приложение просто не запускается, несмотря ни на что. Я уверен, что пропускаю простой, но я не могу найти ответ. Спасибо за помощь. РЕДАКТИРОВАТЬ: я понимаю, что мне нужно переместить этот код, чтобы он обращался к ресурсам фрагмента, но когда я это делаю, это дает мне ошибку:

Невозможно сделать статическую ссылку на нестатический метод findViewById(int) из типа Activity

Куда я должен поместить свой код, если ВСЕ мои представления находятся в моем фрагменте, а не в моем XML-действии? или мне просто нужно, чтобы активность загружала фрагмент для начала? пакет com.example.testapp;

import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.ActionBar;
import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.os.Build;

public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TextView tv = (TextView) findViewById(R.id.textView1);
        tv.setText("Teststring");

    if (savedInstanceState == null) {
        getSupportFragmentManager().beginTransaction()
        .add(R.id.container, new PlaceholderFragment()).commit();
    }


    }



    @Override
    public boolean onCreateOptionsMenu(Menu menu) {


        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;


    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }


    public static class PlaceholderFragment extends Fragment {

        public PlaceholderFragment() {
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.fragment_main, container,
                    false);
            return rootView;
        }

    }


}

ЖУРНАЛ ОШИБОК:

06-14 17:02:27.405: E/AndroidRuntime(1420): FATAL EXCEPTION: main
06-14 17:02:27.405: E/AndroidRuntime(1420): Process: com.example.testapp, PID: 1420
06-14 17:02:27.405: E/AndroidRuntime(1420): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.testapp/com.example.testapp.MainActivity}: java.lang.NullPointerException
06-14 17:02:27.405: E/AndroidRuntime(1420):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
06-14 17:02:27.405: E/AndroidRuntime(1420):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
06-14 17:02:27.405: E/AndroidRuntime(1420):     at android.app.ActivityThread.access$800(ActivityThread.java:135)
06-14 17:02:27.405: E/AndroidRuntime(1420):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
06-14 17:02:27.405: E/AndroidRuntime(1420):     at android.os.Handler.dispatchMessage(Handler.java:102)
06-14 17:02:27.405: E/AndroidRuntime(1420):     at android.os.Looper.loop(Looper.java:136)
06-14 17:02:27.405: E/AndroidRuntime(1420):     at android.app.ActivityThread.main(ActivityThread.java:5017)
06-14 17:02:27.405: E/AndroidRuntime(1420):     at java.lang.reflect.Method.invokeNative(Native Method)
06-14 17:02:27.405: E/AndroidRuntime(1420):     at java.lang.reflect.Method.invoke(Method.java:515)
06-14 17:02:27.405: E/AndroidRuntime(1420):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
06-14 17:02:27.405: E/AndroidRuntime(1420):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
06-14 17:02:27.405: E/AndroidRuntime(1420):     at dalvik.system.NativeStart.main(Native Method)
06-14 17:02:27.405: E/AndroidRuntime(1420): Caused by: java.lang.NullPointerException
06-14 17:02:27.405: E/AndroidRuntime(1420):     at com.example.testapp.MainActivity.onCreate(MainActivity.java:23)
06-14 17:02:27.405: E/AndroidRuntime(1420):     at android.app.Activity.performCreate(Activity.java:5231)
06-14 17:02:27.405: E/AndroidRuntime(1420):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
06-14 17:02:27.405: E/AndroidRuntime(1420):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
06-14 17:02:27.405: E/AndroidRuntime(1420):     ... 11 more

XML-фрагмент_основной

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.testapp.MainActivity$PlaceholderFragment" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

</RelativeLayout>

person David Hunsicker    schedule 14.06.2014    source источник
comment
убедитесь, что (R.id.textView1 существует в вашем activity_main.xml   -  person Rod_Algonquin    schedule 15.06.2014
comment
не могли бы вы попробовать переформатировать свой код? удалить пустые строки и выровнять все? У большинства IDE, таких как eclipse, есть ярлык для этого, например. ‹kbd›CTRL‹/kbd›+‹kbd›SHIFT‹/kbd›+‹kbd›F‹/kbd›   -  person isaias-b    schedule 15.06.2014
comment
Можете ли вы проверить, действительно ли textView1 (с учетом регистра) присутствует в файле activity_main.xml? Если это так, попробуйте очистить проект и собрать его снова. Иногда после внесения множества изменений в XML-файлы необходимо повторно сгенерировать файл R.java, чтобы получить точные идентификаторы.   -  person rhoadster91    schedule 15.06.2014
comment
XML, который вы установили в качестве представления содержимого действия, — это activity_main.xml, а TextView, на который вы пытаетесь сослаться, находится в макете фрагмента xml.   -  person rhoadster91    schedule 15.06.2014
comment
stackoverflow.com/questions/23653778/   -  person laalto    schedule 15.06.2014


Ответы (3)


Можешь выложить xml? Вполне вероятно, что идентификатор, который ваша java предполагает «R.id.textView1», неверен. Может быть, R.id.textview1?

Хорошо, если ваше текстовое представление живет внутри фрагмента, просто сделайте это:

@Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.fragment_main, container,
                    false);
            TextView tv = (TextView) rootView.findViewById(R.id.textView1);
        tv.setText("Teststring");
            return rootView;
        }
person Ryhan    schedule 14.06.2014
comment
как я уже сказал, я уже проверил XML, и идентификатор в порядке. Я думаю, это связано с тем, что я пытаюсь получить доступ к идентификатору фрагмента в onCreate(). Я видел в другом посте, что нужно добавить код, редактирующий представление во фрагменте onCreateView(); но когда я это делаю, я получаю сообщение об ошибке: Невозможно сделать статическую ссылку на нестатический метод findViewById(int) из типа Activity - person David Hunsicker; 15.06.2014
comment
TextView tv = (TextView) rootView.findViewById(R.id.textView1); корневой вид. это была моя проблема, зачем мне это нужно? - person David Hunsicker; 15.06.2014
comment
Это потому, что вы пытались сослаться на нестатический метод родительского класса в статическом внутреннем классе. Я упомянул об этом в своем ответе ниже. - person rhoadster91; 15.06.2014
comment
метод inflate() возвращает ссылку на самое верхнее представление в иерархии fragment_main xml, в этом случае ваш относительный макет, поэтому вы также можете привести его к этому... и оттуда вы просто найдете текстовое представление, которое живет в относительном макете - person Ryhan; 15.06.2014
comment
@DavidHunsicker спасибо, что указали на это. Я понял, почему мое приложение вылетало из-за этого. - person user3152311; 23.04.2018

Вы даете setContentView() неправильный макет, если ваш XML на самом деле объявлен как fragment_main. Вот почему элементы управления в настоящее время null.

// The layout file is not correct.
setContentView(R.layout.activity_second);
person enissay    schedule 14.06.2014
comment
Я использую XML main_activity, а затем загружается fragment_main. fragment_main — это представления, которыми я хочу манипулировать. - person David Hunsicker; 15.06.2014

TextView textView1, на который вы пытаетесь ссылаться, находится в раздутом макете фрагмента. Представление содержимого, которое вы установили в действии, — это activity_main.xml, которое, вероятно, не имеет компонента textView1.

Решение состоит в том, чтобы переопределить метод фрагмента onViewCreated() и установить там текст

@Override
public void onViewCreated (View view, Bundle savedInstanceState)
{
    TextView tv = (TextView) view.findViewById(R.id.textView1);
    tv.setText("My text");
    /* Other code here */
}

Не забудьте вызвать view.findViewById(R.id.textView1), а не просто findViewById(R.id.textView1), потому что в последнем случае вы пытаетесь получить доступ к нестатическому методу окружающего класса в статическом внутреннем классе. Вызывая view.findViewById(R.id.textView1), вы вызываете метод локальной переменной в статическом внутреннем классе.

person rhoadster91    schedule 14.06.2014
comment
Вы имеете в виду фрагмент onCreateView()? - person David Hunsicker; 15.06.2014
comment
нет, есть еще один метод, называемый onViewCreated, который вызывается ПОСЛЕ onCreateView. В этот момент вид расширяется и добавляется к корневому виду. Параметр View view обеспечивает увеличенный вид. Ваше текстовое представление можно найти в этом представлении. - person rhoadster91; 15.06.2014
comment
Не забудьте вызвать view.findViewById(R.id.textView1), а не только findViewById(R.id.textView1), потому что в последнем случае вы пытаетесь получить доступ к нестатическому методу родительского класса в статическом внутреннем классе. Вызывая view.findViewById(R.id.textView1), вы вызываете метод локальной переменной в статическом внутреннем классе. - person rhoadster91; 15.06.2014