karen_turing
karen_turing

Reputation: 39

getting force close when using findviewbyId()

I'm starting to learn android app development and currently practicing with simple apps. I'm writing this app that includes a listview and i want to fill it with fake data but, when i use findViewbyId() in my code the app gives me force close BUT when i set the content view to my fragment instead of activity_main i get no force close, but the app shows me an empty list.

This is my code :

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);
}}

Any help would be appreciated.

Upvotes: 0

Views: 128

Answers (5)

Andrei T
Andrei T

Reputation: 3083

You should start with a proper tutorial not chaotically adding code that you don't understand. Start reading here:
Creating and Using Fragments
After you understood how it goes then you will see that first you need to inflate the layout that contains the stuff you want to find by id and then by using the view(that defines the layout) you can find the desired view(listview, etc).

Upvotes: 0

George Rappel
George Rappel

Reputation: 7208

Before using findViewById you should Create a View variable, use the inflate.. line, use findViewById on the View variable you created, and then return that.

This is what your code should look like:

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;
}}

Upvotes: 0

Diego
Diego

Reputation: 719

First you need inflate your layout...

           @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);    
            ...

Upvotes: 0

king_abu1918
king_abu1918

Reputation: 284

ListView  my listview = (ListView).findViewById(R.id.listview_forcast); 

I think this is how it should be, no container in the code

Upvotes: -1

Buddy
Buddy

Reputation: 11028

You're trying to find a view before you inflate your layout... Try inflating at the top of your method, like this:

@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;
}

Upvotes: 2

Related Questions