MervinWee Ответов: 0

Как я могу гарантировать, что только мой навигационный ящик имеет переключатель и что при включении он включит темный режим?


в настоящее время я хочу создать переключатель внутри моего навигационного ящика таким образом, чтобы при включении темный режим был включен во всем моем приложении. Однако хотя первая проблема с которой я столкнулся это мой домашний экран там уже есть переключатель как видно здесь

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

вот мой код для activity_main:

<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:orientation="vertical"
    android:layout_height="match_parent"
    android:background="@color/white"
    android:id="@+id/drawer"
    tools:context=".MainActivity">

    <include
        android:layout_height="wrap_content"
        android:layout_width="match_parent"
        layout="@layout/drawabletoolbar"/>
    <include
        android:layout_height="wrap_content"
        android:layout_width="match_parent"
        layout="@layout/content_main"/>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:layout_alignParentBottom="false">

        <Switch
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:id="@+id/btnSwitch"
            android:text=""/>



    </LinearLayout>



    <com.google.android.material.navigation.NavigationView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/navi_view"
        app:menu="@menu/drawable_menu"
        app:headerLayout="@layout/drawable_header"
        android:layout_gravity="start"
        android:fitsSystemWindows="true"/>

</androidx.drawerlayout.widget.DrawerLayout>


вот мой код для файла макета, для которого я создал коммутатор в


<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
="" для Android:ориентация="горизонтальный" для android:layout_width="присваиваем" для android:layout_height="присваиваем"&ГТ;

<переключатель
android:layout_width="fill_parent"
="" для android:layout_height="присваиваем" андроид:текст="" для Андроид:идентификатор="@+ID и/btnSwitch"&ГТ;



а вот и мой основной код активности

пакет СГ.еду.РП.c346.app4thnewspd;

импорт androidx.аннотации.RequiresApi;
импорт androidx.совместимости приложений.приложение.ActionBarDrawerToggle;
импорт androidx.совместимости приложений.приложение.AppCompatActivity;
импорт androidx.совместимости приложений.приложение.AppCompatDelegate;
импорт androidx.drawerlayout.виджет.DrawerLayout;
импорт androidx.recyclerview.widget.LinearLayoutManager;
импорт androidx.recyclerview.widget.RecyclerView;
импорт androidx.swiperefreshlayout.виджет.SwipeRefreshLayout;
импорт androidx.appcompat.widget.Панель инструментов;

импорт android.content.Контекст;
импорт android.content.Намерение;
импорт android.content.SharedPreferences;
импорт android.os.Build;
импорт android.os.Bundle;
импорт android.view.View;
импорт android.widget.Кнопка;
импорт android.widget.CompoundButton;
импорт android.widget.EditText;
импорт android.widget.Переключатель;
импорт android.widget.Тост;

импорт com.google.android.material.navigation.NavigationView;

импорт java.util.список ArrayList;
импорт java.util.List;
импорт java.util.Место действия;

импорт retrofit2.Call;
импорт retrofit2.Обратный звонок;
импорт retrofit2.Response;
импорт sg.edu.rp.c346.app4thnewspd.Модель.Статьи;
импорт sg.edu.rp.c346.app4thnewspd.Модель.Заголовки;

public class MainActivity расширяет AppCompatActivity {

RecyclerView recyclerView;
SwipeRefreshLayout swipeRefreshLayout;
EtQuery полей EditText ;
Кнопка btnSearch;
конечная строка API_KEY = "5353a8d609b4415ab6f449f31d46926a";
Адаптер Адаптер;
Список<статьи&ГТ;статьи = Новый ArrayList и Л;&ГТ;();
частная строку запроса;
Панель инструментов панель инструментов;
Выдвижной ящик;
ActionBarDrawerToggle тумблер;
отдельный переключатель btnSwitch;

public static final String MYPREFERENCES = "nightModePrefs";
общедоступные статические заключительные строки KEY_ISNIGHTMODE = "isNIghtMode";
SharedPreferences sharedPreferences;



@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)

@Ручная коррекция
protected void onCreate(Bundle savedInstanceState) {
супер.метод onCreate(savedInstanceState);
setContentView(R. layout.activity_main);


панель инструментов = findViewById(R. id.toolbar);
setSupportActionBar(панель инструментов);



ящик = findViewById(R. id.ящик);
тумблер = новый ActionBarDrawerToggle(это,ящика,панели,Р. строкой.открываем,строке Р..рядом);
ящик.addDrawerListener(тумблер);
переключения.setDrawerIndicatorEnabled(правда);
переключения.состояние();


swipeRefreshLayout = findViewById(R. id.swipeRefresh);
recyclerView = findViewById(R. id.recyclerView);

etQuery = findViewById(R. id.etQuery);
btnSearch = findViewById(R. id.btnSearch);

sharedPreferences = getSharedPreferences(MYPREFERENCES, Context.MODE_PRIVATE);
btnSwitch = findViewById(R. id.btnSwitch);

checkNightModeActivated();

btnSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Ручная коррекция
общественного недействительными onCheckedChanged(CompoundButton buttonView, логическое этот флажок установлен) {
если(не этот флажок установлен){
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
saveNightModeState(правда);
воссоздавать();
}еще {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
saveNightModeState(ложь);
воссоздавать();
}
}
});





recyclerView.setLayoutManager(новый LinearLayoutManager(этот));
конечная строка country = getCountry();

swipeRefreshLayout.setOnRefreshListener(новый SwipeRefreshLayout.OnRefreshListener() {
@Ручная коррекция
общественного недействительными onRefresh() {
retrieveJson("",country,API_KEY);
}
});

retrieveJson("",country, API_KEY);

btnSearch.setOnClickListener(новый вид.OnClickListener() {
@Ручная коррекция
общественного недействительными onclick(посмотреть V) {
если (!etQuery.то gettext().метод toString().равно("")){
swipeRefreshLayout.setOnRefreshListener(новый SwipeRefreshLayout.OnRefreshListener() {
@Ручная коррекция
общественного недействительными onRefresh() {
retrieveJson(etQuery.getText().toString(),country,API_KEY);
}
});
retrieveJson(etQuery.getText().toString(),country,API_KEY);
}еще{
swipeRefreshLayout.setOnRefreshListener(новый SwipeRefreshLayout.OnRefreshListener() {
@Ручная коррекция
общественного недействительными onRefresh() {
retrieveJson("",country,API_KEY);
}
});
retrieveJson("",country,API_KEY);
}
}
});
}

частный недействительными saveNightModeState(логическое ночной режим) {
Общие преференции.Редактор = sharedPreferences.редактировать();

редактор.putBoolean(KEY_ISNIGHTMODE,ночной режим);

редактор.применить();
}
общественного недействительными checkNightModeActivated(){
если(sharedPreferences.getBoolean(KEY_ISNIGHTMODE, ложные)){
btnSwitch.вызове setchecked(правда);
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
}еще {
btnSwitch.вызове setchecked(false в);
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
}
}


частная пустота restartActivity() {
Intent i = новое намерение(getApplicationContext(),MainActivity.class);
startActivity(i);
заканчивать();
}


частная строка getCountry() {
Локаль язык = язык.getDefault();
Строка country = locale.getCountry();
возвращение страны.столоверчения();
}


общественного недействительными retrieveJson(итоговой строке запроса, заключительная страна строке, последней строке значение apiKey){


swipeRefreshLayout.setRefreshing(правда);
Звоните<заголовки>звоните;
если(!etQuery.то gettext().метод toString().равно("")){
call = ApiClient.getInstance().getApi().getSpecificData(query,apiKey);
}еще{
call = ApiClient.getInstance().getApi().getHeadLines(country, apiKey);
}
call.enqueue(новый обратный вызов<заголовки>() {
@Ручная коррекция
общественного недействительными onResponse(позывной&ЛТ;заголовки&ГТ; звонок, ответ И Л;заголовки&ГТ; ответ) {
если (ответ.в случае успеха () и усилитель; & ответ.тела().getArticles() != нуль){
swipeRefreshLayout.setRefreshing(ложь);
статьи.понятно();
статьи = Ответ.тела().getArticles();
adapter = новый адаптер(MainActivity.this,статьи);
recyclerView.setAdapter(адаптер);

}
}

@Ручная коррекция
onFailure общественного недействительными(позывной&ЛТ;заголовки&ГТ; звоните, забрасываемых Т) {
swipeRefreshLayout.setRefreshing(ложь);
Тост.makeText(в MainActivity.это, Т.getLocalizedMessage(), тост.LENGTH_SHORT).показать();
}
});
}
}

Что я уже пробовал:

так что в настоящее время в моем файле макета для которого я создал коммутатор

<item
       android:id="@+id/Mode"
       app:actionLayout="@layout/layout_switch"
       android:icon="@drawable/ic_brightness_4_black_24dp"
       android:title="Dark Mode" />


я попытался изменить actionLayout на activity_main вместо этого но однако хотя после splashScreen ничего не отображается его просто один черный экран

David Crow

Является ли ваше приложение Android 10 (уровень API 29) или выше?

MervinWee

да, и я понял, что не показал ошибку в макете, о которой упоминал, так что вот она.
https://i.stack.imgur.com/DykAO.png

таким образом , вы можете видеть на изображении выше, что у меня есть переключатель, расположенный в правом верхнем углу, но, тем не менее, у меня уже есть переключатель в самом навигационном ящике. следовательно, существует ли какой-либо способ, с помощью которого я мог бы снять переключатель и убедиться, что единственный существующий переключатель находится внутри моего навигационного ящика?

David Crow

"...есть ли какой-нибудь способ, которым я мог бы снять переключатель и убедиться, что единственный существующий переключатель находится в моем навигационном ящике?"

Да, снимите крышку. <Switch> виджет из файла макета.

MervinWee

Хм, но даже после того, как я снял его с выключателя, он все еще остается...

MervinWee

таким образом, в настоящее время после внесения некоторых изменений в мою основную активность я смог успешно разрешить своему переключателю при щелчке включить темный режим для моего приложения, однако в настоящее время проблема заключается в том, что единственный переключатель, который может сделать то, что я сказал до сих пор, - это переключатель на моем домашнем экране, как показано на изображении, которым я поделился выше, но я хочу, чтобы переключатель был в моем навигационном ящике, чтобы иметь возможность Следовательно, как таковой может ли кто-нибудь помочь мне?

0 Ответов