V4 getFragmentManager с активностью - Несовместимые типы
У меня есть простая деятельность, которая выполняется, как ожидалось.
import android.app.Activity;
import android.app.FragmentManager;
// import android.support.v4.app.FragmentManager;
import android.os.Bundle;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// FragmentManager fm = getSupportFragmentManager(); // ActionBarActivity
FragmentManager fm = getFragmentManager(); // Activity
}
}
Затем я заменил
import android.app.FragmentManager;
с
import android.support.v4.app.FragmentManager;
чтобы я мог поддерживать мои старые устройства. Однако это сообщает об ошибке:
Incompatible types.
Required: android.support.v4.app.FragmentManager
Found: android.app.FragmentManager
Что я здесь делаю неправильно?
Популярным решением, которое я нашел, является использование getSupportFragmentManager() вместо этого, но это работает только для ActionBarActivites [edit - see answer] и FragmentActivities.
не может конвертировать из android.app.FragmentManager в android.support.v4.app.FragmentManager
Другое релевантное решение указывает на использование FragmentActivity вместо этого, но у этого, похоже, есть те же проблемы с наследием.
Метод getFragmentManager() - undefined для типа MyActivity
import android.support.v4.app.FragmentManager;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
public class MainActivity extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_main);
// FragmentManager fm = getSupportFragmentManager(); // ActionBarActivity
FragmentManager fm = getFragmentManager();
}
}
Я уверен, что решение этого будет уже на SE, но это нелегко (для меня) найти. Минимальный пример должен помочь другим людям понять это тоже.
Ответы
Ответ 1
В вашем первом случае, если вы используете getSupportFragmentManager()
, вам нужно расширить FragmentActivity
или расширить ActionBarActivity
(расширяет FragmentActivity), поскольку FragmentActivity
является базовым классом для фрагментов, основанных на поддержке.
В вашем втором случае вам нужно использовать getSupportFragmentManager()
вместо getFragmentManager()
.
Фрагменты были введены в соты. Для поддержки фрагментов под сотами вам нужно использовать фрагменты из библиотеки поддержки, и в этом случае вам нужно расширить FragmentActivity
и использовать getSupportFragmentManager()
.
Ответ 2
use getSupportFragmentManager() instead, but this only works for ActionBarActivites.
Неправильно, он должен работать в вашем FragmentActivity
, что FragmentActivity находится в вашем пакете поддержки, когда вы поддерживаете более старое устройство, тогда ваш импорт из activity
, fragment
, fragment managers
и т.д. должен иметь android.support.v4.
, чтобы указать, что вы используете пакет поддержки. без использования этого приведет к incompatible compile time error.
What am I doing wrong here?
Вы комбинируете пакет поддержки с пакетом non support, результатом которого является incompatible compile time error
, как я сказал выше.
Ответ 3
для Kotlin парень не нужно менять, чтобы не v4
используйте ниже, чтобы получить активность, пока ее родитель
(activity as MainDrawerActivity)
или же
((YourActivityName)getActivity());
Ответ 4
Для использования в диалоге Java:
- import android.app.FragmentManager;
- FragmentManager fragmentManager;
Для Котлина:
- (activity as? YourActivity)?.fragmentManager