簡體   English   中英

即使調試器顯示現有片段,findFragmentByTag也返回null

[英]findFragmentByTag returns null even though debugger shows existing fragment

我沒有想法。 我打電話

for(ImageView imageView :((MapFragment)getSupportFragmentManager().findFragmentByTag("MAPFRAGMENT")).imageviewArrayList)
{
    imageView.setClickable(true);
}

但是findFragmentByTag返回null。 調試器顯示: 截圖

當我更進一步時,程序跳過所有if和跳轉返回null。

這是fragmentmanager生成的日志輸出

04-21 19:12:27.492 26499-26499/com.example.paulforster.nxtapp V/FragmentManager: Commit: BackStackEntry{41050da0}
04-21 19:12:27.492 26499-26499/com.example.paulforster.nxtapp D/FragmentManager:   mName=null mIndex=-1 mCommitted=false
04-21 19:12:27.492 26499-26499/com.example.paulforster.nxtapp D/FragmentManager:   Operations:
04-21 19:12:27.499 26499-26499/com.example.paulforster.nxtapp D/FragmentManager:     Op #0: ADD MapFragment{410504e0 id=0x7f0c0071 MAPFRAGMENT}
04-21 19:12:27.499 26499-26499/com.example.paulforster.nxtapp D/FragmentManager:     Op #1: ADD ParkFragment{410505e8 id=0x7f0c0071 PARKFRAGMENT}
04-21 19:12:27.499 26499-26499/com.example.paulforster.nxtapp D/FragmentManager:     Op #2: HIDE ParkFragment{410505e8 id=0x7f0c0071 PARKFRAGMENT}
04-21 19:12:27.499 26499-26499/com.example.paulforster.nxtapp V/FragmentManager: Run: BackStackEntry{41050da0}
04-21 19:12:27.499 26499-26499/com.example.paulforster.nxtapp V/FragmentManager: add: MapFragment{410504e0 id=0x7f0c0071 MAPFRAGMENT}
04-21 19:12:27.499 26499-26499/com.example.paulforster.nxtapp V/FragmentManager: Allocated fragment index MapFragment{410504e0 #0 id=0x7f0c0071 MAPFRAGMENT}
04-21 19:12:27.499 26499-26499/com.example.paulforster.nxtapp V/FragmentManager: add: ParkFragment{410505e8 id=0x7f0c0071 PARKFRAGMENT}
04-21 19:12:27.507 26499-26499/com.example.paulforster.nxtapp V/FragmentManager: Allocated fragment index ParkFragment{410505e8 #1 id=0x7f0c0071 PARKFRAGMENT}
04-21 19:12:27.507 26499-26499/com.example.paulforster.nxtapp V/FragmentManager: hide: ParkFragment{410505e8 #1 id=0x7f0c0071 PARKFRAGMENT}
04-21 19:12:27.507 26499-26499/com.example.paulforster.nxtapp V/FragmentManager: moveto CREATED: MapFragment{410504e0 #0 id=0x7f0c0071 MAPFRAGMENT}
04-21 19:12:27.507 26499-26499/com.example.paulforster.nxtapp V/FragmentManager: moveto CREATED: ParkFragment{410505e8 #1 id=0x7f0c0071 PARKFRAGMENT}
04-21 19:12:27.507 26499-26499/com.example.paulforster.nxtapp V/FragmentManager: moveto ACTIVITY_CREATED: MapFragment{410504e0 #0 id=0x7f0c0071 MAPFRAGMENT}
04-21 19:12:27.554 26499-26499/com.example.paulforster.nxtapp V/FragmentManager: moveto ACTIVITY_CREATED: ParkFragment{410505e8 #1 id=0x7f0c0071 PARKFRAGMENT}
04-21 19:12:27.906 26499-26499/com.example.paulforster.nxtapp V/FragmentManager: moveto STARTED: MapFragment{410504e0 #0 id=0x7f0c0071 MAPFRAGMENT}
04-21 19:12:27.914 26499-26499/com.example.paulforster.nxtapp V/FragmentManager: moveto STARTED: ParkFragment{410505e8 #1 id=0x7f0c0071 PARKFRAGMENT}
04-21 19:12:27.914 26499-26499/com.example.paulforster.nxtapp V/FragmentManager: Commit: BackStackEntry{40feb250}
04-21 19:12:27.914 26499-26499/com.example.paulforster.nxtapp D/FragmentManager:   mName=null mIndex=-1 mCommitted=false
04-21 19:12:27.914 26499-26499/com.example.paulforster.nxtapp D/FragmentManager:   Operations:
04-21 19:12:27.921 26499-26499/com.example.paulforster.nxtapp D/FragmentManager:     Op #0: ADD BluetoothDialogFragment{410503d8 btDialog}
04-21 19:12:27.921 26499-26499/com.example.paulforster.nxtapp V/FragmentManager: moveto RESUMED: MapFragment{410504e0 #0 id=0x7f0c0071 MAPFRAGMENT}
04-21 19:12:27.921 26499-26499/com.example.paulforster.nxtapp V/FragmentManager: moveto RESUMED: ParkFragment{410505e8 #1 id=0x7f0c0071 PARKFRAGMENT}
04-21 19:12:27.921 26499-26499/com.example.paulforster.nxtapp V/FragmentManager: Run: BackStackEntry{40feb250}
04-21 19:12:27.921 26499-26499/com.example.paulforster.nxtapp V/FragmentManager: add: BluetoothDialogFragment{410503d8 btDialog}
04-21 19:12:27.921 26499-26499/com.example.paulforster.nxtapp V/FragmentManager: Allocated fragment index BluetoothDialogFragment{410503d8 #2 btDialog}
04-21 19:12:27.929 26499-26499/com.example.paulforster.nxtapp V/FragmentManager: moveto CREATED: BluetoothDialogFragment{410503d8 #2 btDialog}
04-21 19:12:27.929 26499-26499/com.example.paulforster.nxtapp V/FragmentManager: moveto ACTIVITY_CREATED: BluetoothDialogFragment{410503d8 #2 btDialog}
04-21 19:12:27.968 26499-26499/com.example.paulforster.nxtapp V/FragmentManager: moveto STARTED: BluetoothDialogFragment{410503d8 #2 btDialog}
04-21 19:12:28.101 26499-26499/com.example.paulforster.nxtapp V/FragmentManager: moveto RESUMED: BluetoothDialogFragment{410503d8 #2 btDialog}
04-21 19:13:30.406 26499-26499/com.example.paulforster.nxtapp V/FragmentManager: Commit: BackStackEntry{420bc108}
04-21 19:13:30.406 26499-26499/com.example.paulforster.nxtapp D/FragmentManager:   mName=null mIndex=-1 mCommitted=false
04-21 19:13:30.406 26499-26499/com.example.paulforster.nxtapp D/FragmentManager:   Operations:
04-21 19:13:30.421 26499-26499/com.example.paulforster.nxtapp D/FragmentManager:     Op #0: REMOVE BluetoothDialogFragment{410503d8 #2 btDialog}
04-21 19:13:30.929 26499-26499/com.example.paulforster.nxtapp V/FragmentManager: Run: BackStackEntry{420bc108}
04-21 19:13:30.937 26499-26499/com.example.paulforster.nxtapp V/FragmentManager: remove: BluetoothDialogFragment{410503d8 #2 btDialog} nesting=0
04-21 19:13:30.937 26499-26499/com.example.paulforster.nxtapp V/FragmentManager: movefrom RESUMED: BluetoothDialogFragment{410503d8 #2 btDialog}
04-21 19:13:30.937 26499-26499/com.example.paulforster.nxtapp V/FragmentManager: movefrom STARTED: BluetoothDialogFragment{410503d8 #2 btDialog}
04-21 19:13:30.937 26499-26499/com.example.paulforster.nxtapp V/FragmentManager: movefrom STOPPED: BluetoothDialogFragment{410503d8 #2 btDialog}
04-21 19:13:30.937 26499-26499/com.example.paulforster.nxtapp V/FragmentManager: movefrom ACTIVITY_CREATED: BluetoothDialogFragment{410503d8 #2 btDialog}
04-21 19:13:30.937 26499-26499/com.example.paulforster.nxtapp V/FragmentManager: movefrom CREATED: BluetoothDialogFragment{410503d8 #2 btDialog}
04-21 19:13:30.945 26499-26499/com.example.paulforster.nxtapp V/FragmentManager: Freeing fragment index BluetoothDialogFragment{410503d8 #2 btDialog}

這是整個MainActivity.java

package com.example.paulforster.nxtapp;

import android.bluetooth.BluetoothAdapter;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.PersistableBundle;
import android.support.annotation.NonNull;
import android.support.design.widget.BottomNavigationView;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.MenuItem;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.Toast;
import java.util.Timer;
import java.util.TimerTask;


import de.amr.plt.rcParkingRobot.AndroidHmiPLT;
import parkingRobot.INxtHmi;

//TODO einzeichnen von Fremnden Gegenständen in die Karte
//TODO warum kann ich da nicht parken?
//TODO ParkIcons neben die Linie

public class MainActivity extends AppCompatActivity {

    static final int REQUEST_ENABLE_BT = 154;
    static AndroidHmiPLT hmiModule = null;
    static ArrayAdapter<String> BTArrayAdapter;
    static BluetoothDialogFragment btDialog = null;
    static Timer refreshTimer;
    static TimerTask refreshTimerTask;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main );
        //Kein Bluetooth --> keine App
        BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
        if (mBluetoothAdapter == null) {
            Toast.makeText(this, "Bluetooth ist auf ihrem Gerät nicht verfügbar! :(",
                    Toast.LENGTH_LONG).show();
            finish();
            return;
        }
        BottomNavigationView bottomNavigationView = (BottomNavigationView)
                findViewById(R.id.bottom_navigation);
        for(int i=0; i<3; i++) {
            bottomNavigationView.getMenu().getItem(i).setChecked(false);
        }
        bottomNavigationView.setOnNavigationItemSelectedListener(
                new BottomNavigationView.OnNavigationItemSelectedListener() {
                    @Override
                    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                        switch (item.getItemId()) {
                            case R.id.mode_pause:
                                hmiModule.setMode(INxtHmi.Mode.PAUSE);
                                break;
                            case R.id.mode_scout:
                                hmiModule.setMode(INxtHmi.Mode.SCOUT);
                                break;
                            case R.id.mode_park:
                                hmiModule.setMode(INxtHmi.Mode.PARK_NOW);
                                Toast toast = Toast.makeText(getApplicationContext(),
                                        "Nächste Parklücke wird angefahren", Toast.LENGTH_LONG);
                                toast.show();
                                break;
                        }
                        return false;
                    }
                });

        if (savedInstanceState == null) {
            btDialog = new BluetoothDialogFragment();
            MapFragment mapFragment = new MapFragment();
            ParkFragment parkFragment = new ParkFragment();
            FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
            ft.add(R.id.content, mapFragment, "MAPFRAGMENT");
            ft.add(R.id.content, parkFragment, "PARKFRAGMENT");
            ft.hide(parkFragment);
            ft.commit();
        } else {
            MapFragment mapFragment = (MapFragment) getSupportFragmentManager().findFragmentByTag("MAPFRAGMENT");
            ParkFragment parkFragment = (ParkFragment) getSupportFragmentManager().findFragmentByTag("PARKFRAGMENT");
        }
}

    @Override
    public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
        super.onSaveInstanceState(outState, outPersistentState);
    }

    @Override
    protected void onStart() {
        super.onStart();

        Log.e("AConPause", "onStart");

        reScheduleTimer(100);
    }

    @Override
    protected void onPause() {
        super.onStop();
        Log.e("AConPause", "refreshTimer.cancel() happens");
        refreshTimer.cancel();
        refreshTimer = null;
    }

    @Override
    protected void onResume() {
        super.onResume();

        Log.e("AConPause", "onResume");
        //TODO wenn man gerade Bluetooth eingeschaltet hat, findet er die Liste noch nicht...
        if (!btDialog.isAdded()) if(hmiModule == null) btDialog.show(getSupportFragmentManager(), "btDialog");
        else if (!hmiModule.isConnected()) btDialog.show(getSupportFragmentManager(), "btDialog");
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if(requestCode == REQUEST_ENABLE_BT){
            if(resultCode != RESULT_OK){
                finish();
            }
        }
    }

    public void reScheduleTimer(int duration) {
        refreshTimer = new Timer();
        refreshTimerTask = new MyTimerTask();
        refreshTimer.schedule(refreshTimerTask, 0, duration);
    }

    private class MyTimerTask extends TimerTask {
        @Override
        public void run() {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    refreshMenu();
                }
            });
        }
    }

    public void refreshMenu(){
                    BottomNavigationView bottomNavigationView = (BottomNavigationView)
                            findViewById(R.id.bottom_navigation);
                    FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
                    if (hmiModule != null)
                        if(hmiModule.isConnected()) {
                            Log.e("Status", "is verbunden");
                            if(hmiModule.getCurrentStatus() != null) {
                                Log.e("Status", "is da");
                                switch (hmiModule.getCurrentStatus()) {
                                    case SCOUT:
                                        bottomNavigationView.getMenu().getItem(0).setChecked(false);
                                        bottomNavigationView.getMenu().getItem(1).setChecked(true);
                                        bottomNavigationView.getMenu().getItem(2).setChecked(false);
                                        bottomNavigationView.getMenu().getItem(0).setEnabled(true);
                                        bottomNavigationView.getMenu().getItem(1).setEnabled(true);
                                        bottomNavigationView.getMenu().getItem(2).setEnabled(true);
                                        for(ImageView imageView : ((MapFragment)getSupportFragmentManager().findFragmentByTag("MAPFRAGMENT")).imageviewArrayList){
                                            imageView.setClickable(true);
                                        }
                                        fragmentTransaction.hide((ParkFragment)getSupportFragmentManager().findFragmentByTag("PARKFRAGMENT"));
                                        fragmentTransaction.commit();
                                        if ((((MapFragment) getSupportFragmentManager().findFragmentByTag("MAPFRAGMENT"))).mHandler != null){
                                            String data = "MSG DATA";
                                            Message msg = (((MapFragment) getSupportFragmentManager().findFragmentByTag("MAPFRAGMENT"))).mHandler.obtainMessage(0, data);
                                            msg.sendToTarget();
                                        }
                                        break;
                                    case PARK_NOW:
                                        bottomNavigationView.getMenu().getItem(0).setChecked(false);
                                        bottomNavigationView.getMenu().getItem(1).setChecked(false);
                                        bottomNavigationView.getMenu().getItem(2).setChecked(true);
                                        bottomNavigationView.getMenu().getItem(0).setEnabled(true);
                                        bottomNavigationView.getMenu().getItem(1).setEnabled(true);
                                        bottomNavigationView.getMenu().getItem(2).setEnabled(true);
                                        for(ImageView imageView : ((MapFragment)getSupportFragmentManager().findFragmentByTag("MAPFRAGMENT")).imageviewArrayList){
                                            imageView.setClickable(true);
                                        }
                                        if ((((MapFragment) getSupportFragmentManager().findFragmentByTag("MAPFRAGMENT"))).mHandler != null){
                                            String data = "MSG DATA";
                                            Message msg = (((MapFragment) getSupportFragmentManager().findFragmentByTag("MAPFRAGMENT"))).mHandler.obtainMessage(0, data);
                                            msg.sendToTarget();
                                        }
                                        fragmentTransaction.show((ParkFragment)getSupportFragmentManager().findFragmentByTag("PARKFRAGMENT"));
                                        fragmentTransaction.commit();
                                        /**
                                        if(getSupportFragmentManager().getBackStackEntryCount()==0){
                                            FragmentTransaction ft = getSupportFragmentManager()
                                                    .beginTransaction();
                                            ParkFragment parkFragment = new ParkFragment();
                                            ft.add(R.id.content, parkFragment);
                                            ft.addToBackStack(null);
                                            ft.commit();
                                        }*/
                                        break;
                                    case PARK_THIS:
                                        bottomNavigationView.getMenu().getItem(0).setChecked(false);
                                        bottomNavigationView.getMenu().getItem(1).setChecked(false);
                                        bottomNavigationView.getMenu().getItem(2).setChecked(true);
                                        bottomNavigationView.getMenu().getItem(0).setEnabled(true);
                                        bottomNavigationView.getMenu().getItem(1).setEnabled(true);
                                        bottomNavigationView.getMenu().getItem(2).setEnabled(true);
                                        for(ImageView imageView : ((MapFragment)getSupportFragmentManager().findFragmentByTag("MAPFRAGMENT")).imageviewArrayList){
                                            imageView.setClickable(true);
                                        }
                                        fragmentTransaction.show((ParkFragment)getSupportFragmentManager().findFragmentByTag("PARKFRAGMENT"));
                                        fragmentTransaction.commit();
                                        /**
                                        if(getSupportFragmentManager().getBackStackEntryCount()==0){
                                            FragmentTransaction ft = getSupportFragmentManager()
                                                    .beginTransaction();
                                            ParkFragment parkFragment = new ParkFragment();
                                            ft.add(R.id.content, parkFragment);
                                            ft.addToBackStack(null);
                                            ft.commit();
                                        }
                                         */
                                        break;
                                    case PARKED:
                                        bottomNavigationView.getMenu().getItem(0).setChecked(true);
                                        bottomNavigationView.getMenu().getItem(1).setChecked(false);
                                        bottomNavigationView.getMenu().getItem(2).setChecked(false);
                                        bottomNavigationView.getMenu().getItem(0).setEnabled(false);
                                        bottomNavigationView.getMenu().getItem(1).setEnabled(true);
                                        bottomNavigationView.getMenu().getItem(2).setEnabled(false);

                                        for(ImageView imageView : ((MapFragment)getSupportFragmentManager().findFragmentByTag("MAPFRAGMENT")).imageviewArrayList){
                                            imageView.setClickable(false);
                                        }
                                        fragmentTransaction.hide((ParkFragment)getSupportFragmentManager().findFragmentByTag("PARKFRAGMENT"));
                                        fragmentTransaction.commit();
                                        if ((((MapFragment) getSupportFragmentManager().findFragmentByTag("MAPFRAGMENT"))).mHandler != null){
                                            String data = "MSG DATA";
                                            Message msg = (((MapFragment) getSupportFragmentManager().findFragmentByTag("MAPFRAGMENT"))).mHandler.obtainMessage(0, data);
                                            msg.sendToTarget();
                                        }
                                        break;

                                    case INACTIVE:
                                        bottomNavigationView.getMenu().getItem(0).setChecked(true);
                                        bottomNavigationView.getMenu().getItem(1).setChecked(false);
                                        bottomNavigationView.getMenu().getItem(2).setChecked(false);
                                        bottomNavigationView.getMenu().getItem(0).setEnabled(true);
                                        bottomNavigationView.getMenu().getItem(1).setEnabled(true);
                                        bottomNavigationView.getMenu().getItem(2).setEnabled(true);
                                        //TODO die Arraylist mit den ParkIcons muss hier immernoch existieren
                                        for(ImageView imageView : ((MapFragment)getSupportFragmentManager().findFragmentByTag("MAPFRAGMENT")).imageviewArrayList){
                                            imageView.setClickable(true);
                                        }
                                        fragmentTransaction.hide((ParkFragment)getSupportFragmentManager().findFragmentByTag("PARKFRAGMENT"));
                                        fragmentTransaction.commit();
                                        if ((((MapFragment) getSupportFragmentManager().findFragmentByTag("MAPFRAGMENT"))).mHandler != null){
                                            String data = "MSG DATA";
                                            Message msg = (((MapFragment) getSupportFragmentManager().findFragmentByTag("MAPFRAGMENT"))).mHandler.obtainMessage(0, data);
                                            msg.sendToTarget();
                                        }
                                        break;
                                }
                            }
                        } else {
                            for(int i = 0; i<3; i++){
                                bottomNavigationView.getMenu().getItem(i).setChecked(false);
                                bottomNavigationView.getMenu().getItem(i).setEnabled(false);
                                getSupportFragmentManager().popBackStack();
                            }
                        }
                }

    @Override
    public void onBackPressed() {
        super.onBackPressed();
        if (hmiModule != null && hmiModule.connected) {

            terminateBluetoothConnection();
        }
    }

    /**
     * Terminate the bluetooth connection to NXT
     */
    private void terminateBluetoothConnection(){
        Toast.makeText(this, "Bluetooth connection was terminated!", Toast.LENGTH_LONG).show();
        hmiModule.setMode(INxtHmi.Mode.PAUSE);
        hmiModule.setMode(INxtHmi.Mode.DISCONNECT);
        hmiModule.disconnect();

        while(hmiModule.isConnected()){
            //wait until disconnected
        }
        hmiModule = null;
    }
}

有人暗示我? 謝謝!

編輯錯誤不再發生。 我的目標是使設備旋轉成為可能。 我做了一些撤消/更改,可以在此提交中找到。

也許有人知道會發生什么。

在提交片段事務(onCreate中的ft.commit())后添加此行。

getSupportFragmentManager().executePendingTransactions();

調用commit()不會立即執行事務。 相反,它會在線程能夠執行時將其安排在活動的UI線程(“主”線程)上運行。 但是,如果需要,您可以從UI線程調用executePendingTransactions()以立即執行commit()提交的事務。 除非事務是其他線程中作業的依賴項,否則通常不需要這樣做。

有關executePendingTransactions的詳細信息,請參閱https://developer.android.com/guide/components/fragments.html#Transactions

嘗試這個,

public void refreshMenu(){
                    BottomNavigationView bottomNavigationView = (BottomNavigationView)
                            findViewById(R.id.bottom_navigation);
List<ImageView> imageViewList = ((MapFragment)getSupportFragmentManager().findFragmentByTag("MAPFRAGMENT")).imageviewArrayList;
                    FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
                    if (hmiModule != null)
                        if(hmiModule.isConnected()) {
                            Log.e("Status", "is verbunden");
                            if(hmiModule.getCurrentStatus() != null) {
                                Log.e("Status", "is da");
                                switch (hmiModule.getCurrentStatus()) {
                                    case SCOUT:
                                        bottomNavigationView.getMenu().getItem(0).setChecked(false);
                                        bottomNavigationView.getMenu().getItem(1).setChecked(true);
                                        bottomNavigationView.getMenu().getItem(2).setChecked(false);
                                        bottomNavigationView.getMenu().getItem(0).setEnabled(true);
                                        bottomNavigationView.getMenu().getItem(1).setEnabled(true);
                                        bottomNavigationView.getMenu().getItem(2).setEnabled(true);
                                        for(ImageView imageView :imageViewList){
                                            imageView.setClickable(true);
                                        }
                                        fragmentTransaction.hide((ParkFragment)getSupportFragmentManager().findFragmentByTag("PARKFRAGMENT"));
                                        fragmentTransaction.commit();
                                        if ((((MapFragment) getSupportFragmentManager().findFragmentByTag("MAPFRAGMENT"))).mHandler != null){
                                            String data = "MSG DATA";
                                            Message msg = (((MapFragment) getSupportFragmentManager().findFragmentByTag("MAPFRAGMENT"))).mHandler.obtainMessage(0, data);
                                            msg.sendToTarget();
                                        }
                                        break;

我懷疑你的代碼中的問題是你的beginTransaction與FragmentManager之間,你正在查詢它的FindFragmentByTag,因此我將它移動到beginTransaction的頂部。 在所有使用的地方進行類似的更改,並讓我知道您的反饋

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM