2015-01-15 87 views
1

我想使一個特定的嵌套FrameLayout動態可見。但是,當我嘗試訪問我的片段的onCreateView()方法之外的視圖時,我得到NullPointerException。所以這是我的實現。訪問onCreateView()方法以外的視圖

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方法被稱爲第一)

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 
+0

一切看起來不錯,但一旦嘗試getView()而不是myView ... – duggu

+0

您不需要存儲對根佈局的引用。你可以調用Fragments'getView()'方法。但是這不會導致問題。請檢查R.layout.listView中是否存在ID ldrawlayout – aschattney

+0

@aschattney R.layout.listView是一個ListView,因此此特定的framelayout不存在。它存在於另一個用作列表視圖行的xml中 – stud91

回答

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

嘗試在apiCompleted

+0

請接受答案 – Pavya

+0

這不會給我一個nullptr異常,但佈局仍然是不可見的。 – stud91

+0

在我的xml中,我將佈局設置爲android:visibility =「gone」 – stud91

0

這個代碼是你的確認onCreateView()方法在apiCompleted()方法之前調用。

如果是,只要您持有引用,您應該能夠訪問代碼中任何位置的視圖。

您可以添加一些日誌來查看訂單的職能得到所謂

+0

yes請參閱更新後的問題 – stud91

-1

使用onViewCreated方法來獲取view的正確方法:

@Override 
    public void onViewCreated(View view, Bundle savedInstanceState) { 
     super.onViewCreated(view, savedInstanceState); 
     myView = view; 
    } 
2

好吧,我看到的問題。你想訪問行佈局,但是你的列表視圖有這個佈局的多個版本,這意味着你不能從活動訪問行佈局,你必須在你的listadapter中執行它,或者你在listadapter中給你單行唯一的ID如row.setId(row.getId + positionOfRow)

+0

在適配器的getView()方法中設置唯一ID後,可以訪問行,但是listview必須先填充,而不是每個元素都在開始時生成。 更簡單的方法是將apiCompleted東西移動到您的適配器中並將其安排在那裏。或者更酷的是,您可以在api完成時添加行並使其不可見/不可見。你也可以添加一個動畫來添加項目到一個列表視圖,並且也有一個很好的用戶體驗。交易嗎?;) – Mann

+0

我試圖爲我的適配器使用getView()方法,並將視圖設置爲可見,但即使在那裏,我也有nullptrexception – stud91

+0

這是一個令人困惑的混亂你想要做什麼。你想在api完成或者完整的listview後看到每一個物品嗎? – Mann