WebHU - Programozási kérdések és válaszok

Esemény hozzáadása, amikor a vissza nyílra(getSupportActionBar().setDisplayHomeAsUpEnabled(true)) kattint

A problémám majdnem ugyanaz, mint a következővel: Stop AsyncTask in Fragments, when Back A gomb meg van nyomva

De le akarom állítani az AsyncTask-omat, amikor a vissza nyílra kattintanak. Van egy kódom az asynctask leállításához, és működik, ha más módon implementáltam. Kipróbáltam, amit eddig kutattam, de még mindig vannak hibák. Kérem, segítsen ebben.

Kipróbáltam ezt a kódot

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
    int id=item.getItemId();

    if(id==android.R.id.home)
    {
        Intent returnIntent = new Intent();
        returnIntent.putExtra("flag",userid);
        setResult(Activity.RESULT_OK,returnIntent);
        finish();
        return true;
    }}

FRISSÍTVE: Ezzel a kóddal egy másik töredékhez lépek.

Fragment2 fragmentChild = new Fragment2 ();

FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.add(R.id.content, fragmentChild);
transaction.addToBackStack(null);
transaction.commit();

Nincs probléma a visszalépéssel, amikor egy másik töredékhez megyek. Ezután ezt a kódot (getSupportActionBar().setDisplayHomeAsUpEnabled(true)) használom a (Drawer.java) fájlban a vissza nyíl megjelenítéséhez. Most szeretném hozzáadni az eseményt, amikor a vissza nyílra kattintottam.

SZERKESZTÉS: (Drawer.java)

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    final ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
            this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
    drawer.setDrawerListener(toggle);
    toggle.syncState();

    final View.OnClickListener originalToolbarListener = toggle.getToolbarNavigationClickListener();

    getSupportFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
        @Override
        public void onBackStackChanged() {
            if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
                toggle.setDrawerIndicatorEnabled(false);
                toggle.setToolbarNavigationClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        getSupportFragmentManager().popBackStack();
                    }
                });
            } else {
                toggle.setDrawerIndicatorEnabled(true);
                toggle.setToolbarNavigationClickListener(originalToolbarListener);
            }
        }
    });

  • Milyen hibákat kaptál? 16.05.2017
  • A hibák, amikor az AsyncTask nem működött. Kipróbáltam a fenti kódot, akkor működik, ha tevékenységet használok. De töredéket használok 17.05.2017
  • @Benjie mutassa meg a LogCatjét vagy azokat a hibákat. 17.05.2017
  • @Sufian ez ilyen [DEBUG] get_category: változó seinfo: platform érzékenység: NULL, kategória: NULL vagy néha Nem találom a töredékem nézetét. Sajnos nem tudom megadni a teljes logcat hibát, mert nem találom az előzőeket. A hiba akkor történt, amikor az AsyncTask még nem fejezte be az adatok betöltését a szerverről a listanézetembe, majd visszanyomtam 17.05.2017
  • @Benjie frissítse kérdését, és illessze be ide ezt a LogCat-et. Kérjük, formázza is. 17.05.2017
  • Ez a kérdés most a stackoverflow.com/questions/14437745/ 17.05.2017
  • még mindig nem oldja meg a problémámat. Olyan, mintha az android.R.id.home nem működne 17.05.2017
  • Tegyük világossá egyszer: a error használatával arra gondolsz, hogy a kódod fordítódik, de nem a várt módon fut? Vagy a kódod egyáltalán nem fordít le, és fordítási hibáid vannak? 17.05.2017
  • A kódom fut, és csak akkor tapasztalok hibát, amikor visszakattintottam, még akkor is, ha az aszinkronfeladat még nem fejeződött be. Sajnálom 17.05.2017
  • @Benjie kérlek írd be a @sufian karaktert a megjegyzésedbe, ha azt szeretnéd, hogy értesítést kapjak (tehát tudom, hogy válaszolnom kell). 18.05.2017
  • @Benjie nem mondtad, hogy mi nem működött android.R.id.home kapcsán. Adjon részletesebben. 18.05.2017
  • @Sufian nem észlel semmilyen eseményt. Próbáltam pirítóst hozzáadni, de nem ment. Btw, töredéket használok, uram 19.05.2017
  • @Benjie a Fragmentsben, a töredéked onActivityCreated()-ába (vagy kapcsolódó metódusába) setHasOptions(true);-t kell írnod. Csak ezt követően lehet felfújni a menüt, vagy meghívni a töredéked onOptionsItemSelected() részét. 19.05.2017

Válaszok:


1

Ha megfelelően beállította a műveletsávot, akkor ezt a következőkkel érheti el:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case android.R.id.home:
        // Add the code to stop the task
        break;
    }
    return super.onOptionsItemSelected(item);
}

SZERKESZTÉS: Miután kezelni tudja a vissza gomb eseményt, hozzáadhatja a kódot a feladatok töredékes lezárásához. Először is létrehoztam egy felületet, amelyet minden olyan töredék implementál, amely képes bezárni ezeket a feladatokat.

public interface TaskCancelFragment {
    void cancelTask();
}

A töredékekben történő megvalósítás valahogy így néz ki:

@Override
public void cancelTask() {
    //Add the code to cancel the task
    Toast.makeText(getContext(), "The task is canceled", Toast.LENGTH_SHORT).show();
}

Az utolsó lépés az esemény elküldése tevékenységről töredékre. Itt feltételezek néhány dolgot, mivel nem férek hozzá a kódjához, hogy lássam, hogyan adja hozzá/keresse meg a töredékeket, de szerencsére ez nem számít annyira, és könnyen megváltoztatható. A kezdeti válasz mellett létrehoztam egy új módszert a tevékenységben az aktuális töredék megtalálásához és a feladat bezárásához.

private void cancelTasks() {
    Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.placeholder);
    if (fragment instanceof TaskCancelFragment) {
        ((TaskCancelFragment) fragment).cancelTask();
    }
}

És a végén a case android.R.id.home így néz ki:

case android.R.id.home:
    cancelTasks();
    onBackPressed(); // I think that you want to close the activity too
    break;
16.05.2017
  • A getSupportActionBar().setDisplayHomeAsUpEnabled(true) funkciót használom a visszafelé mutató nyíl megjelenítésére, amikor egy másik töredékre kattintok. Megpróbáltam ezt a kódot egy tevékenységben használni, és jól működik, alkalmazható töredékben is? 17.05.2017
  • Nem, ez önmagában nem fog működni egy Fragmentben. Ahhoz, hogy ez működjön, létre kell hoznia egy kis megoldást. 17.05.2017
  • mondanál egy példát, hogyan kell csinálni? 17.05.2017
  • Frissítettem a választ, hogy kezeljem a töredékek belsejében záródó feladatot. Ha valami nem világos, írjon megjegyzést. 17.05.2017
  • Köszönöm a választ. Szerintem az a bajom, hogy még mindig nem tudja érzékelni, ha a vissza nyílra kattintanak. És az általad közzétett kódot használtam. További információért frissítettem a kérdésem 17.05.2017
  • Adja hozzá a tevékenység kódját, ahol hozzáadja a műveletsort, mert ha nem kapja meg az eseményt, a probléma biztosan ott van. 17.05.2017
  • Igazából nem tudom hol a hiba. Még mindig új vagyok az Android fejlesztőben. Feltettem a fiókom kódját. Btw, csak a hamburger navót cserélem vissza nyílra. Köszönöm 17.05.2017
  • Új anyagok

    A rádiógomb ellenőrzött eseményének használata a jQueryben
    Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

    Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
    Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

    Miért érdemes elkezdeni a kódolást 2023-ban?
    01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

    🎙 Random Noise #2  – Örökbefogadás és hit
    az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

    A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
    A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

    5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
    Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

    Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
    A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..