2014-02-12 7 views
2

У меня есть простое приложение для Android. В папке макета отображается файл activity_main.xml и файл fragment_main.xml. В этом файле fragment.xml я поместил кнопку, которую я назвал buttonTest.ANDROID STUDIO Не удается получить доступ к объектам в фрагменте_main.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:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
android:paddingBottom="@dimen/activity_vertical_margin" 
tools:context="com.snapvest.thunderbird.app.MainActivity$PlaceholderFragment"> 

<LinearLayout 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:layout_alignParentBottom="true" 
    android:layout_alignParentRight="true"> 

    <Button 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="TEST" 
     android:id="@+id/buttonTest" 
     android:layout_gravity="center_horizontal" /> 
</LinearLayout> 

в файле MainActivity.java Я пытаюсь получить доступ к этой buttonTest.

public class MainActivity extends Activity { 

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

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

    // Get access to the buttons 
    final Button buttonTest = (Button)findViewById(R.id.buttonTest); 
} 

Это компилируется нормально. Но когда я запускаю его, переменная buttonTest возвращается как нулевой указатель. Почему он не находит объект buttonTest?

ответ

1

Причина findViewById() не удается найти кнопку, потому что setContentView() штрихами findViewById() к только посмотреть в файле layout.xml вы дали setContentView(), и ваша кнопка не находится в R.layout.activity_main. Если ваша кнопка находится в Fragment (которая, как представляется, должна быть), вы должны получить доступ к ней и управлять ею с Fragment, а не Activity. Это гарантирует, что ваша логика останется развязанной, что позволит вам повторно использовать Fragment с различными Activities.

+0

Оба файла activity_main.xml и fragment_main.xml находятся в папке макета. Когда я изначально запускаю Android Studio и добавляю это как новое приложение, я автоматически создаю как активность, так и файлы фрагмента xml, и даже выделяет (автоматически выбирает) фрагмент_main.xml для первоначального редактирования. Это говорит мне, что мой макет должен действительно находиться в файле fragment_main.xml (а не в activity_main.xml). Что касается того, где я должен попытаться получить доступ к кнопке, есть файл MainActivity.java, но явно не соответствует явно фрагменту. Фактически, MainActivity.java является единственным java-файлом. –

+0

Если я изменяю setContentView (R.layout.activity_main); setContentView (R.layout.fragment_main); [Т.е. к FRAGMENT], то я действительно могу получить доступ к кнопке и получить ненулевой указатель на нее. Но тогда приложение сообщает «К сожалению, SnapVest перестала работать». –

6

Я думаю, что нашел решение. MainActivity.java устанавливает файл activity_main.xml, который затем использует fragment_main.xml в качестве своего (первоначально) одиночного первичного фрагмента. Вот почему мы должны фактически разместить весь наш пользовательский интерфейс для работы в основном в файле fragment_main.xml (и на самом деле не помещать NOTHING в activity_main.xml).

В нижней части MainActivity.java есть раздел, который инициализирует файл фрагмента_main.xml. И мне нужно получить доступ к кнопкам и другим объектам пользовательского интерфейса для фрагмента. Такие как:

/** 
* A placeholder fragment containing a simple view. 
*/ 
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); 

     // Get access to the buttons 
     final Button buttonAvailableOptions = (Button)rootView.findViewById(R.id.buttonAvailableOptions); 

     return rootView; 
    } 
} 

Большая часть этого, выше, автоматически добавляется Android Studio. Часть, начинающаяся с «Получить доступ к кнопке», принадлежит мне, и там вы настраиваете любой доступ к кнопкам и другим объектам пользовательского интерфейса или их обработку.

+0

Я нашел ответ здесь: http://stackoverflow.com/questions/23653778/nullpointerexception-accessing-views-in-oncreate – cabaji99

Смежные вопросы