stud91
stud91

Reputation: 1854

Accessing views outside of onCreateView() method

I am trying to make a particular nested FrameLayout visible dynamically. However, i am getting NullPointerException when i try to access the view outside of my fragment's onCreateView() method. So here is my implementation.

private View myView;

public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View fragmentView =  inflater.inflate(R.layout.listView, container, false);
    this.myView = fragmentView;
    ...
   return fragmentView;
}

@Override
public void apiCompleted(ApiResult apiResult, HttpRequest httpRequest) {

 if(myLocationManager.hasLocation()){

    FrameLayout flayout = (FrameLayout) myView.findViewById(R.id.ldrawlayout);
    flayout.setVisibility(View.VISIBLE);
 }
 }

listView.xml

<LinearLayout 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:background="@color/background_gray"
    tools:context=".fragment.MallListFragment"
    android:orientation="vertical">

    <ListView
        android:id="@+id/lv_malls"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
    </ListView>

</LinearLayout>

rowlist.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/row_mallx"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/white"
    android:paddingBottom="7dp">

    <FrameLayout
        android:id="@+id/ldrawlayout"
    >
    ...
    </FrameLayout>
</RelativeLayout>

LOGCAT (onCreateView method is called first)

01-15 18:40:16.905    7633-7633/? V/onCreateView METHOD CALLED﹕ onCreateView
01-15 18:40:17.280    7633-7633/? V/APICOMPLETED METHOD CALLED﹕ apiCompleted

Upvotes: 1

Views: 1052

Answers (3)

Pavya
Pavya

Reputation: 6025

LayoutInflater Inflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View view = Inflater.inflate(R.layout.row_mallx, null);

FrameLayout flayout = (FrameLayout) view .findViewById(R.id.ldrawlayout);

flayout.setVisibility(View.VISIBLE);

try this code in on apiCompleted

Upvotes: 1

Mann
Mann

Reputation: 661

Ok, I see the problem. You want to access the row-layout, but your listview has multiple versions of this layout, that mean you can not access the row layout from the activity, you have to do it in your listadapter or you give your single rows in the listadapter an unique id such as row.setId(row.getId + positionOfRow)

Upvotes: 2

Xu Zhang
Xu Zhang

Reputation: 64

Are your sure that the onCreateView() method is called before the apiCompleted() method.

If yes, you should be able to access the view any where in your code as long as you hold the reference to it.

You can add some logs to see the order that the functions get called

Upvotes: 0

Related Questions