2012-03-29 3 views
53

У меня есть Activity, который использует Fragment. Я просто хочу передать объект из этого Activity в Fragment.Передача объекта от объекта к фрагменту

Как я мог это сделать? Все обучающие материалы, которые я видел до сих пор, где извлекаются данные из ресурсов.

EDIT:

Давайте быть немного более точным:

Моя активность имеет ListView на левой части. Когда вы нажимаете на нее, идея заключается в загрузке Fragment с правой стороны.

При вводе этого Activity объект Category предоставляется через Intent. Этот объект содержит список других объектов Questions (который содержит список строк). Эти объекты Questions отображаются в ListView. Когда я нажимаю на один предмет из ListView, я хочу отобразить Список String в FragmentListView).

Для этого я позвоню setContentView() с моего Activity с макетом. В этом макете определен Fragment с правильным классом для вызова. Когда я называю это setContentView(), вызывается onCreateView() моего Fragment, но в это время getArguments() возвращает null.

Как мне удалось заполнить его до звонка onCreateView()? (скажите мне, если я не достаточно ясно)

Благодаря

ответ

98

Создать статический метод в Fragment и затем получите его с помощью getArguments().

Пример:

public class CommentsFragment extends Fragment { 
    private static final String DESCRIBABLE_KEY = "describable_key"; 
    private Describable mDescribable; 

    public static CommentsFragment newInstance(Describable describable) { 
    CommentsFragment fragment = new CommentsFragment(); 
    Bundle bundle = new Bundle(); 
    bundle.putSerializable(DESCRIBABLE_KEY, describable); 
    fragment.setArguments(bundle); 

    return fragment; 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, 
     ViewGroup container, Bundle savedInstanceState) { 

    mDescribable = (Describable) getArguments().getSerializable(
     DESCRIBABLE_KEY); 

    // The rest of your code 
} 

Вы можете затем вызвать из Activity делать что-то вроде:

FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
Fragment fragment = CommentsFragment.newInstance(mDescribable); 
ft.replace(R.id.comments_fragment, fragment); 
ft.commit(); 
+0

Привет, Macarse, когда вызывается метод newInstance? – Nico

+0

@Nico: Я обновлю эту информацию. – Macarse

+0

Я также обновил свой вопрос. Спасибо за вашу помощь. – Nico

10

Вы должны создать метод в вашем фрагменте, который принимает тип объекта, который вы хотите передать в него. В этом случае я назвал его «setObject» (творческий huh? :)). Этот метод может выполнить любое действие, которое вам нужно с этим объектом.

MyFragment fragment; 

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 

     if (getSupportFragmentManager().findFragmentById(android.R.id.content) == null) { 
      fragment = new MyFragment(); 
      getSupportFragmentManager().beginTransaction().add(android.R.id.content, detailsFragment) 
        .commit(); 
     } else { 
      fragment = (MyFragment) getSupportFragmentManager().findFragmentById(
        android.R.id.content); 
     } 


     fragment.setObject(yourObject); //create a method like this in your class "MyFragment" 
} 

Обратите внимание, что я использую библиотеку поддержки и вызовы в getSupportFragmentManager() может быть только getFragmentManager() для вас в зависимости от того, что вы работаете с

+2

Только будьте осторожны при использовании этого метода на фрагменте, который может переживет ваш хостинг вид (retainInstance правда). –

+5

Это не сработает. Когда ваше приложение замирает в фоновом режиме, и пользователь возвращает его на передний план, 'setObject' не обязательно будет вызываться. –

+4

@MartinKonecny ​​в этом случае метод onCreate будет вызываться снова (потому что активность будет воссоздана), и поэтому также будет вызван setObject. Если это не так, объясните свой комментарий. Спасибо. – eftokay83

7

В своем классе деятельности:

public class BasicActivity extends Activity { 

private ComplexObject co; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main_page); 

    co=new ComplexObject(); 
    getIntent().putExtra("complexObject", co); 

    FragmentManager fragmentManager = getFragmentManager(); 
    Fragment1 f1 = new Fragment1(); 
    fragmentManager.beginTransaction() 
      .replace(R.id.frameLayout, f1).commit(); 

} 

Примечание: Ваш объект должен реализовать Сериализуемый интерфейс

Затем в фрагменте:

public class Fragment1 extends Fragment { 

ComplexObject co; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    Intent i = getActivity().getIntent(); 

    co = (ComplexObject) i.getSerializableExtra("complexObject"); 

    View view = inflater.inflate(R.layout.test_page, container, false); 
    TextView textView = (TextView) view.findViewById(R.id.DENEME); 
    textView.setText(co.getName()); 

    return view; 
} 
} 
3

Передача аргументов по пачке ограничивается некоторыми типами данных. Но вы можете передавать любые данные на свой фрагмент так:

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

public void passData(Context context, List<LexItem> list, int pos) { 
    mContext = context; 
    mLexItemList = list; 
    mIndex = pos; 
} 

и в вашем PassData активности вызова() со всеми необходимыми типами данных после того, как инстанцировании фрагмент

 WebViewFragment myFragment = new WebViewFragment(); 
     myFragment.passData(getApplicationContext(), mLexItemList, index); 
     FragmentManager fm = getSupportFragmentManager(); 
     FragmentTransaction ft = fm.beginTransaction(); 
     ft.add(R.id.my_fragment_container, myFragment); 
     ft.addToBackStack(null); 
     ft.commit(); 

Примечание: Мой фрагмент проходит "android.support.v4.app.Fragment", поэтому я должен использовать "getSupportFragmentManager()". Конечно, этот принцип будет работать также с классом фрагментов, расширяющим «Фрагмент», но тогда вы должны использовать «getFragmentManager()».

0

См. Следующий пример.

1. В фрагменте: Создайте ссылочную переменную для класса, объект которого требуется в фрагменте. Просто создайте метод setter для ссылочной переменной и вызовите setter перед заменой фрагмента из действия.

MyEmployee myEmp; 
public void setEmployee(MyEmployee myEmp) 
{ 
    this.myEmp = myEmp; 
} 

2. В деятельности:

//we need to pass object myEmp to fragment myFragment 

    MyEmployee myEmp = new MyEmployee(); 

    MyFragment myFragment = new MyFragment(); 

    myFragment.setEmployee(myEmp); 

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
    ft.replace(R.id.main_layout, myFragment); 
    ft.commit(); 
Смежные вопросы