Как связать фрагмент с PhoneStateListener - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть следующие 2 класса: первый - это вкладка для активности с вкладками, а второй - для получения данных о соединении LTE с телефона. Мне нужно напечатать значения во фрагмент. До этого код первого класса был в Activity, но ему нужно было перейти в extends Fragment.

public class Tab1Values extends Fragment {
    TextView tv1,tv2,tv3;
    int value=0,dbm=0;
    String ptype="",ntype="";
    public Tab1Values() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View v=inflater.inflate(R.layout.fragment_tab1, container, false);
        tv1=(TextView)v.findViewById(R.id.info);
        tv2=(TextView)v.findViewById(R.id.info2);
        tv3=(TextView)v.findViewById(R.id.info3);
        TelephonyManager tm=(TelephonyManager)getActivity().getSystemService(Context.TELEPHONY_SERVICE);
        ->tm.listen(new Tab1Signal2(this.getActivity()), PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);
        String opname="\nOperator ID:"+" "+tm.getNetworkOperator();
        opname=opname+"\nOperator Name:"+" "+tm.getNetworkOperatorName();
        int phoneType=tm.getPhoneType(),networkType=tm.getNetworkType();

        return v;
    }
}

SecondClass

public class Tab1Signal2 extends PhoneStateListener {
    Context mcontext;
    int LteSignalStrength=0,LteRsrp=0,LteRsrq=0,LteRssnr=0,LteCqi=0;
    int value1=0,value2=0,CdmaDbm=0,CdmaEcio=0,EvdoDbm=0,EvdoEcio=0,EvdoSnr=0;
    //int cid=0,lac=0,psc=0,statid=0,netid=0,sysid=0,lat=0,lon=0;
    String error,ss,val1,ccloc;
    private Tab1Values main;

    public Tab1Signal2(Context context){
        mcontext=context;
        ->main=(Tab1Values) mcontext;
    }
    public void onSignalStrengthsChanged(SignalStrength signalStrength){
        super.onSignalStrengthsChanged(signalStrength);
        if (signalStrength.isGsm()) {
            value1=signalStrength.getGsmBitErrorRate();
            value2=signalStrength.getGsmSignalStrength();
        }else if (signalStrength.getCdmaDbm() > 0) {
            CdmaDbm=signalStrength.getCdmaDbm();
            CdmaEcio=signalStrength.getCdmaEcio();
        } else {
            EvdoDbm=signalStrength.getEvdoDbm();
            EvdoEcio=signalStrength.getEvdoEcio();
            EvdoSnr=signalStrength.getEvdoSnr();
        }
        try {
            Method[] methods = android.telephony.SignalStrength.class
                    .getMethods();
            for (Method mthd : methods) {
                if (mthd.getName().equals("getLteSignalStrength")){
                    //val1=mthd.getName() ;
                    LteSignalStrength=(Integer)mthd.invoke(signalStrength);
                    //main.test(val2);
                }
                if (mthd.getName().equals("getLteRsrp")){
                    LteRsrp=(Integer)mthd.invoke(signalStrength);
                }
                if (mthd.getName().equals("getLteRsrq")){
                    LteRsrq=(Integer)mthd.invoke(signalStrength);
                }
                if (mthd.getName().equals("getLteRssnr")){
                    LteRssnr=(Integer)mthd.invoke(signalStrength);
                }
                if (mthd.getName().equals("getLteCqi")){
                    LteCqi=(Integer)mthd.invoke(signalStrength);
                }
                main.test(LteSignalStrength,LteRsrp,LteRsrq,LteRssnr,LteCqi);
            }
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }
}

Я поставил стрелку на линии, которые я считаю ошибкой. Спасибо

1 Ответ

0 голосов
/ 09 ноября 2018

Вы можете использовать EventBus для передачи необходимых данных

https://github.com/greenrobot/EventBus

Событие для отправки, вы можете добавить поля, которые вы хотите передать:

public static class MessageEvent { /* Additional fields if needed */ }

Добавить функцию для прослушивания EventBus:

@Subscribe(threadMode = ThreadMode.MAIN)  
public void onMessageEvent(MessageEvent event) {/* Do something */};

Зарегистрировать событие во фрагменте (и отменить регистрацию), например:

 @Override
 public void onStart() {
     super.onStart();
     EventBus.getDefault().register(this);
 }

 @Override
 public void onStop() {
     super.onStop();
     EventBus.getDefault().unregister(this);
 }

И после события:

EventBus.getDefault().post(new MessageEvent());
...