Android - Активность настройки внутри фрагмента пуста - PullRequest
1 голос
/ 05 августа 2020

Я создаю приложение, которое содержит 5 вкладок в нижнем меню навигации. Одна из этих вкладок содержит действие с настройками по умолчанию, которое я создал с помощью Android Studio. Событие onClick на каждой вкладке отображает отдельный фрагмент. Когда я нажимаю на кнопку «Настройки», фрагмент действия настроек загружается без ошибок, однако он пуст. Я искал в другом месте, но все еще не нашел ответа. Моя проблема заключается не в отображении группы настроек в другом фрагменте, а в создании в первый раз самого фрагмента настроек.

Я прослушиваю событие щелчка в основном действии. Затем я загружаю правильный класс фрагмента, этот класс вызывает класс .SettingsActivity , который генерирует представление, используя settings_activity. xml, и загружает «настройки» из root_parameters. xml. Я ничего не изменил из активности по умолчанию, созданной Android Studio. И я загружаю его так же, как загружаю другие фрагменты, и все они работают, включая фрагмент Google Maps.

Это мой .MainActivity

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {

    setTheme(R.style.AppTheme);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    BottomNavigationView bottomNav = findViewById(R.id.bottom_navigation);
    bottomNav.setOnNavigationItemSelectedListener(navListener);

    getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new HomeFragment()).commit();
}

private BottomNavigationView.OnNavigationItemSelectedListener navListener =
        new BottomNavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                Fragment selectedFragment = null;

                switch (item.getItemId()) {
                    case R.id.map_nav:
                        selectedFragment = new MapFragment();
                        break;
                    case R.id.settings_nav:
                        selectedFragment = new OldSettingsFragment();
                        break;
                    case R.id.user_nav:
                        selectedFragment = new UserFragment();
                        break;
                    case R.id.test_settings_nav:
                        selectedFragment = new SettingsFragment();
                        break;
                    default:
                        selectedFragment = new HomeFragment();
                        break;
                }

                getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, selectedFragment).commit();

                return true;
            }
        };

}

Вот мой .SettingsFragment

public class SettingsFragment extends Fragment {
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

    return inflater.inflate(R.layout.settings_activity, container, false);
}

}

Это .SettingsActivity , созданный Android Studio

public class SettingsActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.settings_activity);
    getSupportFragmentManager()
            .beginTransaction()
            .replace(R.id.settings, new SettingsFragment())
            .commit();
    ActionBar actionBar = getSupportActionBar();
    if (actionBar != null) {
        actionBar.setDisplayHomeAsUpEnabled(true);
    }
}

public static class SettingsFragment extends PreferenceFragmentCompat {
    @Override
    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
        setPreferencesFromResource(R.xml.root_preferences, rootKey);
    }
}

}

Это settings_activity. xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context=".TestSettings.SettingsActivity">

    <FrameLayout
        android:id="@+id/settings"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

И наконец это это мои root_preferences. xml

<PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto">

<PreferenceCategory app:title="@string/app_name">

    <EditTextPreference
        app:key="signature"
        app:title="@string/signature_title"
        app:useSimpleSummaryProvider="true" />

    <ListPreference
        app:defaultValue="reply"
        app:entries="@array/reply_entries"
        app:entryValues="@array/reply_values"
        app:key="reply"
        app:title="@string/reply_title"
        app:useSimpleSummaryProvider="true" />

</PreferenceCategory>

<PreferenceCategory app:title="@string/sync_header">

    <SwitchPreferenceCompat
        app:key="sync"
        app:title="@string/sync_title" />

    <SwitchPreferenceCompat
        app:dependency="sync"
        app:key="attachment"
        app:summaryOff="@string/attachment_summary_off"
        app:summaryOn="@string/attachment_summary_on"
        app:title="@string/attachment_title" />

</PreferenceCategory>

ПОМОГИТЕ.

Ответы [ 2 ]

1 голос
/ 05 августа 2020

Вы не можете установить Activity на одной из вкладок BottomNavigationView вместо фрагмента.

Итак, вам нужно заменить SettingsActivity на фрагмент, я назову его PreferenceFragment, как вы уже имеет внутренний SettingsFragment.

Так что измените свой SettingsActivity с помощью:

public class PreferenceFragment extends Fragment {

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_settings, container, false);
        
        ActionBar actionBar = requireActivity().getSupportActionBar();
        if (actionBar != null) {
            actionBar.setDisplayHomeAsUpEnabled(true);
        }

        return view;
    }

    public static class SettingsFragment extends PreferenceFragmentCompat {
        @Override
        public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
            setPreferencesFromResource(R.xml.root_preferences, rootKey);
        }
    }

}

Итак, теперь удалите settings_activity.xml, и вам нужно создать fragment_settings.xml вместо stati c фрагмент для внутреннего SettingsActivity фрагмент

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:id="@+id/settings_root"
    android:layout_height="match_parent">

    <fragment
        android:id="@+id/settingsFragment"
        class="com.xx.PreferenceFragment$SettingsFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</androidx.constraintlayout.widget.ConstraintLayout>

Примечание: замените com.xx именем вашего пакета, содержащим PreferenceFragment

0 голосов
/ 05 августа 2020

Вы загружаете SettingsFragment на test_settings_nav, щелкните, который раздувает R.layout.settings_activity, и весь макет имеет FrameLayout под LinerLayout, и вы ничего не загружаете в этот FrameLayout, поэтому его Пусто. Загрузите что-нибудь в этом макете кадра, который появится на экране.

...