2015-09-24 4 views
0

Я начинаю изучать разработку приложений для Android и в настоящее время практикую простые приложения. Я пишу это приложение, которое включает в себя список, и я хочу заполнить его поддельными данными, но, когда я использую findViewbyId() в своем коде, приложение дает мне силу закрыть BUT, когда я установил представление содержимого для своего фрагмента вместо Activity_main i не закрывайте силу, но приложение показывает мне пустой список.Получение силы закрывается при использовании findviewbyId()

Это мой код:

package com.example.karen.please; 

public class MainActivityFragment extends Fragment { 

private ArrayAdapter<String> mForecastAdapter; 
public MainActivityFragment() { 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    String[] forecastArray = 
      { 
        "sunny", 
        "cloudy", 
        "asteroids", 
        "rainy", 
        "sunny" 
      }; 
    List<String> weekforecast = new ArrayList<String>(Arrays.asList(forecastArray)); 
    mForecastAdapter = 
      new ArrayAdapter<String>(
        getActivity(), 
        R.layout.list_item_forecast, 
        R.id.list_item_forecast_textview, 
        weekforecast 
      ); 
    ListView mylistview = (ListView)container.findViewById(R.id.listview_forecast); //screws upp in this line 
    mylistview.setAdapter(mForecastAdapter); 
    return inflater.inflate(R.layout.fragment_main, container, true); 
}} 

Любая помощь будет оценена.

+0

Опубликовать свой logcat, plase. http://stackoverflow.com/help/mcve –

ответ

2

Вы пытаетесь найти вид, прежде чем раздувать макет ... Попробуйте надувать в верхней части методы, например:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View myView = inflater.inflate(R.layout.fragment_main, container, true); 

    <all the other init code you have> 

    return myView; 
} 
0

Перед использованием findViewById вы должны создать View переменные, использование линии inflate.., используйте findViewById в переменной View, которую вы создали, и затем верните это.

Это то, что ваш код должен выглядеть следующим образом:

package com.example.karen.please; 
public class MainActivityFragment extends Fragment { 

private ArrayAdapter<String> mForecastAdapter; 
public MainActivityFragment() { 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Instead of inflate and return instantly, store it in a variable, 
    // Then return at the end of the method. 
    View view = inflater.inflate(R.layout.fragment_main, container, true); 

    [...] 

    // Here, use findViewById on the View you have just inflated. 
    ListView mylistview = (ListView) view.findViewById(R.id.listview_forecast); //screws upp in this line 
    mylistview.setAdapter(mForecastAdapter); 
    // Return the view you created on the beginning. 
    return view; 
}} 
-1
ListView my listview = (ListView).findViewById(R.id.listview_forcast); 

Я думаю, что это, как это должно быть, не контейнер в коде

+0

Функция 'findViewById' без какого-либо вида, указанного ранее, работает только в действиях. В таких случаях, когда вы используете фрагмент, вам нужно получить представление с помощью 'getView()' или какой-либо другой переменной 'View' и вызвать' findViewById' в этом представлении. Что-то вроде 'view.findViewById (R ...)', так как у них нет указанного вида содержимого. Ваш ответ хорошо работает для действий, потому что вы используете 'setContentView (R.layout ..)' после создания каждого из них, поэтому у вас есть представление, связанное с Activity. – George

+0

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

+0

Нет проблем! Я видел, что кто-то отказался от этого, но не оставил никаких комментариев, к сожалению, это распространено здесь. Я пытался объяснить это вам, потому что у меня было много сомнений в прошлом и потребовалось некоторое время, чтобы понять это. Так что, возможно, я могу помочь кому-то другому :) – George

0

Сначала вам нужно раздуть макет ...

  @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
           Bundle savedInstanceState) { 
      View rootView = inflater.inflate(R.layout.fragment_main, container, false); 
      ... 
      ListView mylistview = (ListView)rootView.findViewById(R.id.listview_forecast);  
      ... 
0

Вы должны начать с правильного учебника, не хаотически добавляя код, который вы не используете. понимания всего. Начните читать здесь:
Creating and Using Fragments
После того, как вы поняли, как это происходит, вы увидите, что сначала вам нужно раздуть макет, содержащий материал, который вы хотите найти по id, а затем, используя представление (определяющее макет), вы может найти нужный вид (listview и т. д.).

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