2013-06-29 3 views
2

Я пишу код для Android, дело в том, что когда я вызываю findViewById, он возвращает мне null, и я не могу понять почему! С тех пор я растратил свой мозг, но я не могу понять решение. Цель состоит в том, чтобы установить макет как заголовок для listView. Вот мой код, соответственно мой заголовок и моя страница:Android, findViewById возвращает null

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/header" 
    android:orientation="horizontal" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_marginBottom="5dp"> 

    <TextView 
     android:text="@string/bydistance" 
     android:layout_gravity="left" 
     android:layout_width="0dp" 
     android:layout_weight="1" 
     android:layout_height="wrap_content" 
     android:textSize="13dp" 
     android:gravity="center_horizontal"/> 

    <TextView 
     android:text="@string/byactivity" 
     android:layout_gravity="right" 
     android:layout_width="0dp" 
     android:layout_weight="1" 
     android:layout_height="wrap_content" 
     android:textSize="13dp" 
     android:gravity="center_horizontal"/> 

</LinearLayout> 

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:orientation="vertical" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:background="#ff0000" 
    > 

    <ListView 
     android:id="@+id/parkList" 
     android:layout_height="wrap_content" 
     android:layout_width="match_parent" 
     android:divider="@android:color/transparent" 
     android:dividerHeight="5.0dp"> 
    </ListView> 

</LinearLayout> 

А вот мой код, где я называю addheaderView:

public class NearMeFragment extends Fragment implements View.OnClickListener{ 

private FragmentManager fragmentManager; 

@Override 
public void onCreate(Bundle savedBundle){ 
    super.onCreate(savedBundle); 
} 

@Override 
public View onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedBundle) { 
    View v = inflater.inflate(R.layout.park_list, container, false); 

    //TODO remove 
    make_test(v, container); 

    return v; 
} 

public void openTest(View view){ 
    new LiveComment().show(getChildFragmentManager(), "dialog"); 
} 

public void onClick(View view){ 
    if (fragmentManager == null) 
     fragmentManager = getChildFragmentManager(); 
    //if (view.getId() == R.id.test){ 
     fragmentManager.beginTransaction().add(new LiveComment(), "livecomment").commit(); 
} 

private void make_test(View v, ViewGroup container) { 

    ListView listView = (ListView) v.findViewById(R.id.parkList); 
    Park[] list = new Park[3]; 
    list[0] = new Park("parco a", "acquasparta", false, false, 1, 2, 3); 
    list[1]=new Park("parco b", "perugia", false, false, 1, 2, 3); 
    list[2]=new Park("parco b", "perugia", false, false, 1, 2, 3); 
    ParkListAdapter adapter = new ParkListAdapter(v.getContext(), R.layout.small_park_container,list); 
    LinearLayout header = (LinearLayout) container.findViewById(R.id.header); 
    listView.addHeaderView(header); 
    listView.setAdapter(adapter); 

} 
} 

ошибка дается на

listView.addHeaderView(header) 

ответ

4

R.id.header является внутри v не внутри container.

Изменить

LinearLayout header = (LinearLayout) container.findViewById(R.id.header); 

с

LinearLayout header = (LinearLayout) v.findViewById(R.id.header); 

о ViewGroup контейнера в док говорит:

Если не равно нулю, это родительский вид, что UI фрагмента должен быть прилагается. Фрагмент не должен добавлять представление, но это может быть использовано для создания LayoutParams представления.

Edit: Так как ваш вид заголовка находится в другом макете вы должны раздуть его тоже:

@Override 
public View onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedBundle) { 
    View v = inflater.inflate(R.layout.park_list, container, false); 
    View header = inflater.inflate(R.layout.headerlayout, null); 
    //TODO remove 
    make_test(v, header); 

    return v; 
} 

и

private void make_test(View v, View header) { 

    // your code 

    // you have to remove LinearLayout header = (LinearLayout) container.findViewById(R.id.header); 
    listView.addHeaderView(header); 
    listView.setAdapter(adapter); 

} 
+0

Я уже пробовал. Однако я повторил, и он дает мне ту же ошибку – litiales

+0

внутри макета, который вы публикуете, почему вы дважды помещаете ? эти две разные схемы? – Blackbelt

+0

да! Я определил заголовок как отдельный макет. Разве я не должен делать? – litiales