Понять значение выражения в контексте кода - activityCallback = (ToolbarListener) - PullRequest
0 голосов
/ 02 января 2019

Я пытаюсь понять значение этой строки:

activityCallback = (ToolbarListener) context

под выражением -


public class ToolbarFragment extends Fragment implements SeekBar.OnSeekBarChangeListener {


    private static int seekValue = 10;
    private static EditText editText;

    ToolbarListener activityCallback;

    public interface ToolbarListener {

        public void onButtonClick (int position, String text);

    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        try {activityCallback = (ToolbarListener) context;}
            catch (ClassCastException e) {
            throw new ClassCastException(context.toString() + "must implement ToolBarListener");
            }

    }

Я понимаю, что ссылка на контекст (в данном случае Parent Activity) будет создана и сохранена в переменной actioncallback с использованием приведенного выше выражения.

Однако я не могу понять, как можно привести объект интерфейса.к деятельности (здесь контекст).

Я в состоянии понять другой код в полном объеме, и мой проект работает.Это проект, в котором родительское действие связывается с двумя фрагментами, используя интерфейс слушателя.

Я прикрепил java-файлы всего проекта на случай, если вы захотите просмотреть код.

С уважением, Рави.

----ToolbarFragment.java-----
package com.ebookfrenzy.fragmentexample;

import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.SeekBar;

public class ToolbarFragment extends Fragment implements SeekBar.OnSeekBarChangeListener {


    private static int seekValue = 10;
    private static EditText editText;

    ToolbarListener activityCallback;

    public interface ToolbarListener {

        public void onButtonClick (int position, String text);

    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        try {activityCallback = (ToolbarListener) context;}
            catch (ClassCastException e) {
            throw new ClassCastException(context.toString() + "must implement ToolBarListener");
            }

    }

    @Override
    public View onCreateView(LayoutInflater inflater,
                             ViewGroup container,
                             Bundle savedInstanceState) {
        // inflate the layout for this fragment

        View view = inflater.inflate(R.layout.toolbar_fragment, container,false);

        editText = (EditText) view.findViewById(R.id.editText1);
        final SeekBar seekBar = view.findViewById(R.id.seekBar1);
        seekBar.setOnSeekBarChangeListener(this);
        final Button button = view.findViewById(R.id.button1);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                buttonClicked(v);
            }
        });



        return view;
    }

    private void buttonClicked(View v) {
        activityCallback.onButtonClick(seekValue, editText.getText().toString());
    }


    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
        seekValue = progress;
    }

    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {

    }

    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {

    }
}

-----TextFragment.java----

package com.ebookfrenzy.fragmentexample;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;



public class TextFragment extends Fragment {

    private static TextView textView;

    @Override
    public View onCreateView(
            LayoutInflater inflater,
            ViewGroup container,
            Bundle savedInstanceState) {
        // inflate the layout for this fragment

        View view = inflater.inflate(R.layout.text_fragment, container, false);
        textView = (TextView)view.findViewById(R.id.textView1);
        return view;

    }

    public void changeTextProperties (int fontSize, String text) {
        textView.setTextSize(fontSize);
        textView.setText(text);

    }
}

----FragmentActivity.java----

package com.ebookfrenzy.fragmentexample;

import android.app.Activity;
import android.support.v4.app.FragmentActivity;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class FragmentExampleActivity extends FragmentActivity
            implements ToolbarFragment.ToolbarListener{

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

    @Override
    public void onButtonClick(int fontSize, String text) {
        TextFragment textFragment = (TextFragment)
                getSupportFragmentManager().findFragmentById(R.id.text_fragment);
        textFragment.changeTextProperties(fontSize, text);

    }
}

1 Ответ

0 голосов
/ 02 января 2019

Может быть несколько разных действий, которые могут разместить этот фрагмент в разных обстоятельствах. Итак, мы создаем правило: любая деятельность, в которой размещен этот фрагмент, должна реализовывать ToolbarListener. Этот интерфейс определяет «контракт» между фрагментом и действиями, которые его размещают. В onAttach () мы проверяем, что контекст является ToolbarListener, затем продолжаем и сохраняем приведение к ToolbarListener для дальнейшего использования.

Поскольку действие реализует ToolbarListener, так ToolbarListener будет Родителем объекта реализованного Действия. Следовательно, вы можете набрать его.

...