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, но это нелегко (для меня) найти. Минимальный пример должен помочь другим людям понять это тоже.

  • Я новичок в Android.

Ответы

Ответ 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