2015-12-18 2 views
1

Я новичок в фрагментах, и они немного запутывают меня прямо сейчас. Я прочитал много и фактически создал тестовое приложение, используя this tutorialдобавление динамического содержимого на фрагменты android

Мне удалось добавить дополнительные вкладки и так далее. Но я не хочу отображать статический контент (xmls). Я хочу, чтобы иметь возможность изменять пользовательский интерфейс, добавлять списки, загружать json-данные с помощью asynctasck и т. Д., Но первая попытка, которую я сделал, потерпела неудачу.

Так на Tab1:

public class Tab1 extends Fragment { 

@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    View v =inflater.inflate(R.layout.tab_1,container,false); 
    return v; 
} 

}

Я попытался объявить TextView и редактировать его текст с SetText но я получаю аварии, а также findviewbyid не доступен в качестве метода. Это не бросало и ошибки при вводе getView(). FindViewById, но это не проблема.

Являются ли фрагменты ограниченными или сильно отличаются от традиционных видов деятельности? Нужно ли делать бесконечные настройки , чтобы получить загрузку списка?

спасибо.

ответ

1

Вы должны объявить TextView в качестве переменной-члена для вашего класса и получить ссылку на эту точку зрения в onCreateView как:

public class Tab1 extends Fragment { 

    // your TextView member variable 
    private TextView mTextView; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, @Nullable Bundle savedInstanceState) { 
     View v =inflater.inflate(R.layout.tab_1, container, false); 
     mTextView = (TextView) v.findViewById(R.id.my_text_view); 
     return v; 

    } 

    // It is safe to access the views here, not in onCreate since it is called before onCreateView 
    @Override 
    public void onActivityCreated(Bundle savedInstanceState){ 
     super.onActivityCreated(savedInstanceState); 

     mTextView.setText("Hello, World!"); 

    } 
} 

Для справки на Fragment lifecycle

фрагменты ограниченный или сильно отличающийся от традиционных видов деятельности?

Отрывок имеет свой жизненный цикл, как у какого-либо процесса, но это зависит от жизненного цикла своей родительской деятельности, поэтому ответить на ваш вопрос, они не очень отличаются, это просто хорошая практика для модульности кода.

Нужно ли делать бесконечные настройки для получения загрузки списка?

Немного непонятно, что вы подразумеваете под постоянными настройками, но загрузка динамического ListView очень проста в Android.

Для примера:

использованием fragment_one.xml у нас есть только FrameLayout

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/fl_list_container" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"/> 

И код:

public class Tab1 extends Fragment { 

    // your FrameLayout member variable 
    private FrameLayout mFlParent; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, @Nullable Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.fragment_one, container, false); 
     mFlParent = (FrameLayout) v.findViewById(R.id.fl_list_container); 
     return v; 

    } 

    // It is safe to access the views here, not in onCreate since it is called before onCreateView 
    @Override 
    public void onActivityCreated(Bundle savedInstanceState){ 
     super.onActivityCreated(savedInstanceState); 

     // Create a new list, adapter and add a item click listener 
     ListView myList = new ListView(context); // context needed 
     myList.setAdapter(new ArrayAdapter<String>(context, android.R.id.simple_list_item_1, new String []{"Item 1", "Item 2", "Item 3", "Item 4"})); 
     myList.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       //... handle clicks on list items as usual 
      } 
     }); 

     // add the view to the FrameLayout 
     mFlParent.addView(myList); // may want to call mFlParent.removeAllViews(); before adding just to be safe 
    } 
} 

Удачи и счастливого кодирования.

+0

Благодарим за подробное описание. Я хорошо знаком с listviews, но поскольку текстовое представление не работает, я думал, что не будет listviews, и у меня не было нервов, чтобы сделать это альтернативным/сложным способом. – inrob

0

Fragment не указал (а) деятельность.

Если вы хотите использовать методы findViewById, вы должны использовать поле класса.

public class Tab1 extends Fragment { 

private View mView; 

@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    mView = inflater.inflate(R.layout.tab_1,container,false); 
    return mView; 
} 

@Override 
public void onCreate() { 
    // here you can use `findViewById` method via `mView` variable 
    mView.findViewById(YOUR_VIEW_ID); 
} 
} 
0

Существует в основном два способа, чтобы быть использованы в фрагменте 1. onCreateView 2. onViewCreated

Первый из них является использование раздувать макет на вашем фрагменте Второй один использовать, чтобы найти все представление, используемые в макете.

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, @Nullable Bundle savedInstanceState) { 
    View v =inflater.inflate(R.layout.tab_1, container, false); 
    return v; 

} 



@Override 
public void onViewCreated(View v){ 
    mTextView = (TextView) v.findViewById(R.id.my_text_view); 
    mTextView.setText("Hello, World!"); 

} 
+0

Спасибо, я не знал об этом методе. – inrob

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