вызов метода из внешнего класса (не активности) для выполнения при открытии фрагмента - PullRequest
0 голосов
/ 24 октября 2018

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

Моя первая попытка была использовать что-то вроде: Mercury test = new Mercury ();test.mCalculation;

Это работает, но я не уверен, как это использовать.

Вот основная деятельность:

public class MainActivity extends     
AppCompatActivity implements 
TestFragment.OnFragmentInteractionListener {

Button btnFavourites;
Mercury mercury;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    btnFavourites = (Button) findViewById(R.id.button_test);

    btnFavourites.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {


            android.support.v4.app.FragmentManager fragmentManager = MainActivity.this.getSupportFragmentManager();
            android.support.v4.app.FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

            TestFragment fragment = new TestFragment();

            fragmentTransaction.add(R.id.frame_layout, fragment);
            fragmentTransaction.commit();
            btnFavourites.setVisibility(View.GONE);

        }
    });



}

@Override
public void onFragmentInteraction(Uri uri) {

}

}

Вот фрагмент:

public class TestFragment extends Fragment {
// TODO: Rename parameter arguments, choose    
names that match
// the fragment initialization parameters,    
e.g.     ARG_ITEM_NUMBER
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
private TextView planetLongitude;
private TextView planetLatitude;

// TODO: Rename and change types of parameters
private String mParam1;
private String mParam2;

Mercury test;

private OnFragmentInteractionListener mListener;

public TestFragment() {
    // Required empty public constructor
}

/**
 * Use this factory method to create a new instance of
 * this fragment using the provided parameters.
 *
 * @param param1 Parameter 1.
 * @param param2 Parameter 2.
 * @return A new instance of fragment TestFragment.
 */
// TODO: Rename and change types and number of parameters
public static TestFragment newInstance(String param1, String param2) {
    TestFragment fragment = new TestFragment();
    Bundle args = new Bundle();
    args.putString(ARG_PARAM1, param1);
    args.putString(ARG_PARAM2, param2);
    fragment.setArguments(args);
    return fragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if (getArguments() != null) {
        mParam1 = getArguments().getString(ARG_PARAM1);
        mParam2 = getArguments().getString(ARG_PARAM2);



    }





}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_test, container, false);




         planetLongitude = (TextView) view.findViewById(R.id.latitude);

        planetLongitude.setText("" + Mercury.getLonecl());




        return view;
    }


// TODO: Rename method, update argument and hook method into UI event
public void onButtonPressed(Uri uri) {
    if (mListener != null) {
        mListener.onFragmentInteraction(uri);
    }
}

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    if (context instanceof OnFragmentInteractionListener) {
        mListener = (OnFragmentInteractionListener) context;
    } else {
        throw new RuntimeException(context.toString()
                + " must implement OnFragmentInteractionListener");
    }
}

@Override
public void onDetach() {
    super.onDetach();
    mListener = null;
}

/**
 * This interface must be implemented by activities that contain this
 * fragment to allow an interaction in this fragment to be communicated
 * to the activity and potentially other fragments contained in that
 * activity.
 * <p>
 * See the Android Training lesson <a href=
 * "http://developer.android.com/training/basics/fragments/communicating.html"
 * >Communicating with Other Fragments</a> for more information.
 */
public interface OnFragmentInteractionListener {
    // TODO: Update argument type and name
    void onFragmentInteraction(Uri uri);
}

}

Здесьэто класс, который я хочу выполнить при открытии фрагмента:

public class Mercury {

public static double xv = 0;
public static double yv = 0;
private static double lonecl = 0;
private static double latecl = 0;
public static double N = 48.3313 + 3.24587e-5 * PlanetVariableCalculations.getd2();
public static double i = 7.0047 + 5.00e-8 * PlanetVariableCalculations.getd2();
public static double w = 29.1241 + 1.0144e-5 * PlanetVariableCalculations.getd2();
public static double a = 0.387098;
public static double e = 0.205635 + 5.59e-10 * PlanetVariableCalculations.getd2();
public static double M = 168.6562 + 4.0923344368 * PlanetVariableCalculations.getd2();
public static double w1 = N + w;
public static double L = M + w1;
public static double q = a * (1 - e);
public static double Q = a * (1 + e);
public static double E0 = 0;
public static double P = Math.pow(a, 1.5);


   private void mCalculation() {
    if (M < 0) {
        while (M < 0) {
            M = M + 360;
        }

    } else if (M > 360) {
        while (M > 360) {
            M = M - 360;
        }
    }
    EccentricAnomaly(M);
}

private void EccentricAnomaly(double M) {


    double angleInRadian = Math.toRadians(M);
    double E = M + e * Math.sin(angleInRadian) * (1.0 + e * Math.cos(angleInRadian));
    if (e > 0.06) {
    E0 = E;
    double angleInRadianE = Math.toRadians(E0);
    double E1 = E0 - (E0 - e * Math.sin(angleInRadianE) - M) / (1 - e * Math.cos(angleInRadianE));
    while (E1 != E0) {
        E1 = E0;
        E1 = E0 - (E0 - e * Math.sin(angleInRadianE) - M) / (1 - e * Math.cos(angleInRadianE));
    }

    xv = Math.cos(E1) - e;
    yv = Math.sqrt(1.0 - e * e) * Math.sin(E1);

    //} else{
    xv = Math.cos(E) - e;
    yv = Math.sqrt(1.0 - e * e) * Math.sin(E);
}

double v = Math.atan2(yv, xv);
double r = Math.sqrt(xv * xv + yv * yv);

double xh = r * (Math.cos(N) * Math.cos(v + w) - Math.sin(N) * Math.sin(v + w) * Math.cos(i));
double yh = r * (Math.sin(N) * Math.cos(v + w) - Math.cos(N) * Math.sin(v + w) * Math.cos(i));
double zh = r * (Math.sin(v + w) * Math.sin(i));
double lacteclsqr = Math.sqrt(xh * xh + yh * yh);

lonecl = 2+2;
latecl = Math.atan2(zh,lacteclsqr );


}

public static double getLonecl(){
    return lonecl;
}

public static double getLatecl(){
    return latecl;
}

}

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Я попытаюсь ответить на это, хотя я не совсем уверен, что вы подразумеваете под "Я не могу заставить программу математики выполняться".

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

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

double lonEcl = Mercury.computeLonEcl();

Я думаю, что ваша проблема в том, что метод private void mCalculation() является private , то есть он доступен только в классе Mercury.Вы можете заменить private на public и использовать его через экземпляр следующим образом:

Mercury instance = new Mercury();
instance.mCalculation();
instance.getLonEcl();

Кроме того, вы должны сделать эти константы в своем классе private static final... или сделать их общедоступнымиесли они вам нужны вне класса.

0 голосов
/ 24 октября 2018

Несколько вещей здесь.

Первый.

Вы не открываете фрагмент.Вы добавляете, удаляете, отображаете или скрываете фрагмент.

Если вы не используете DialogFragment, но это не так.

Second.

У вашего класса помощника нет причинсохранить экземпляр.Так что нет никаких причин для этого.Сделайте ваши методы статическими в математическом классе и получите к ним доступ как

Mercury.doMyMathProblem(args...)

Теперь, если вы говорите «эй, я все еще хочу использовать экземпляр».Что ж, тогда вы можете либо создать синглтон, если вам нужен только один для всего приложения, либо вы можете просто обновить его по мере необходимости, например.

new Mercury().doMyMathProblems(args...)

Если вам нужно сохранить его в переменной экземпляра в вашемфрагмент, а затем просто создайте его в вашем методе onCreate.

onCreate(){
    mMercuryInstance = new Mercury()
}

onButtonClick(){
    Int answer = mMercuryInstance.doMyMathProblem(args...)
}

Конечно, это просто псевдокод, но вы должны разобраться в этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...