android.support.v4.app.FragmentManager ИЛИ android.app.FragmentManager?
-
21-12-2019 - |
Вопрос
Я изучаю разработку для Android.Я застреваю на чем-то, что должно быть очень простым.
Я создаю приложение с одним действием, 2 фрагментами и 1 интерфейсом.
android:minSdkVersion="11"
android:targetSdkVersion="19
Итак, в основном действии я пытаюсь создать ссылку на фрагмент B с помощью менеджера.Я застрял здесь, потому что Eclispse говорит мне изменить некоторые вещи (см. Ниже).:
Мое намерение:`
@Override
public void respond(int i) {
// TODO Auto-generated method stub
FragmentManager manager =getFragmentManager();
FragmentB f2= (FragmentB) manager.findFragmentById(R.id.fragment2);
}`
Если я сделаю это таким образом, я получу сообщения об ошибках и мне нужно будет внести некоторые изменения.После внесения изменений код выглядит следующим образом (и я все еще не могу связаться с FragmentB):
@Override
public void respond(int i) {
// TODO Auto-generated method stub
android.app.FragmentManager manager =getFragmentManager();
android.app.Fragment f2= manager.findFragmentById(R.id.fragment2);
}
Для получения дополнительной информации я также приведу здесь заголовок импорта действия:
package com.example.modular_ui;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.ActionBar;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.app.Activity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.os.Build;
public class MainActivity extends Activity implements Communicator{....
Чего я здесь не понимаю?вся эта история с support.v4 / support.v7 немного сбивает с толку новичков.
Редактировать:После перехода на:
import android.app.Fragment;
import android.app.FragmentManager;
И расширяя FragmentActivity, я все еще не могу создать ссылку на FragmentB:
@Override
public void respond(int i) {
// TODO Auto-generated method stub
FragmentManager man = getFragmentManager();
FragmentB b = man.findFragmentById(R.id.fragment2);
}
Как и было запрошено, я опубликовал код FragmentB:
package com.example.modular_ui;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
public class FragmentB extends Fragment {
TextView text;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
return inflater.inflate(R.layout.fragment_b, container);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onActivityCreated(savedInstanceState);
text = (TextView) getActivity().findViewById(R.id.textView1);
}
Основной XML
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.modular_ui.MainActivity"
tools:ignore="MergeRootFrame" >
<fragment
android:id="@+id/fragment1"
android:name="com.example.modular_ui.FragmentA"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<fragment
android:id="@+id/fragment2"
android:name="com.example.modular_ui.FragmentB"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/fragment1"
android:layout_marginTop="54dp" />
</RelativeLayout>
Решение
Прежде всего: Ваша деятельность должна продлевать фрагментацию.
о поддержке библиотек.Они были представлены, чтобы добавить некоторые функции на старые андроиды.Например, фрагменты были введены в Android 3.0 (SDK NR: 11).На самом деле (согласно документации) в Androids 3.0 <поддержка Listary использует систему внедрения фрагментов.
Другие советы
просто используйте getsupportforgmentmanager ();После того, как вы успешно добавили библиотеку поддержки.
OP был так близок к созданию решения, которое бы отлично работало для API 11 и новее не нуждаясь в поддержке.v4.
Ему просто нужно было изменить свое мнение . Фрагмент также не использовать support.v4 в своем импорт заявление.
Краткое изложение этих двух подходов. ВСЕ ваши Действия и фрагменты должен быть код, который выглядит точно так один из этих;не смешивайте их!(Не все строки необходимы во всех файлах;используйте строки по мере необходимости.)
поддержка-подход v4
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.Fragment; <-- ".support.v4"
import android.support.v4.app.FragmentManager;
... MainActivity extends FragmentActivity ...
... = getSupportFragmentManager();
.... YourFragment extends Fragment ... <-- same in both approaches
Подход API 11+
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
... MainActivity extends Activity ...
... = getFragmentManager();
.... YourFragment extends Fragment ... <-- same in both approaches
Поэтому, если у вас есть проект, написанный с использованием одного из описанных выше подходов, и вы интегрируете код из других источников, обязательно найдите эти строки и измените их, чтобы они соответствовали тому, что у вас есть.
Это просто.
Если вы также хотите, чтобы ваше приложение запустилось у старых устройств (ниже уровня API), используйте getSupportFragmentManager()
.
Если вы хотите ваше приложение запустить на устройствах с уровнем API выше 11, то используйте
getFragmentManger()
.