Не могу найти, где отсутствует контекст - PullRequest
0 голосов
/ 22 марта 2020

Я проводил рефакторинг предыдущего проекта, чтобы использовать фрагменты вместо создания отдельных действий в качестве школьного задания. Я пытался выяснить, где эта ошибка в течение почти часа и не повезло. У меня пропадает контекст, когда я добавляю эту строку canvas.setColor(color, position);

Вот основное занятие:

    public class MainActivity extends AppCompatActivity implements PaletteFragment.SpinnerSelectedInterface {

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

            PaletteFragment palette = PaletteFragment.newInstance();

            Bundle bundle = new Bundle();
            bundle.putStringArray(KeyData.PASS_COLOR, getResources().getStringArray(R.array.colors));
            bundle.putStringArray(KeyData.PASS_POSITION, getResources().getStringArray(R.array.colorNames));
            palette.setArguments(bundle);

            getSupportFragmentManager().beginTransaction().add(R.id.palette_fragment, palette).commit();
        }

        @Override
        public void setCanvasColor(String color, int position) {
            CanvasFragment canvas = CanvasFragment.newInstance(null);
            getSupportFragmentManager().beginTransaction().add(R.id.canvas_fragment, canvas).addToBackStack(null).commit();
            canvas.setColor(color, position);
        }
    }

А вот фрагмент:

public class CanvasFragment extends Fragment {
    private TextView displayColor;
    private View background;

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

    public static CanvasFragment newInstance(Bundle bundle) {
        CanvasFragment fragment = new CanvasFragment();
        fragment.setArguments(bundle);
        return fragment;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_canvas, container, false);
        displayColor = (TextView) v.findViewById(R.id.displayColor);
        background = (View) v.findViewById(R.id.canvas_fragment);
        return v;
    }

    public void setColor(String color, int position){
        String[] names = getResources().getStringArray(R.array.colorNames);
        displayColor.setText(names[position]);
        background.setBackgroundColor(Color.parseColor(color));
    }

Я пробовал переопределите onAttach и onDetach для фрагмента холста и добавьте прослушиватель сообщений, но все равно получите ошибку. Был бы признателен за все, что может направить меня в правильном направлении.

Ошибка

java.lang.IllegalStateException: Fragment CanvasFragment{69925d5 (240edefb-318c-4983-bd15-cf45142e849a) id=0x7f080047} not attached to a context.

1 Ответ

0 голосов
/ 22 марта 2020

Когда вы звоните

getSupportFragmentManager()
    .beginTransaction()
    .add(R.id.canvas_fragment, canvas)
    .addToBackStack(null)
    .commit();

Вы используете commit(). Согласно его Javado c:

Планирует принятие этой транзакции. Фиксация не происходит немедленно; она будет запланирована как работа над основным потоком, которая будет выполнена в следующий раз, когда поток будет готов.

Так, когда вы немедленно вызовете canvas.setColor(color, position) непосредственно после этого Фрагмент не присоединен и с ним еще не связан Context.

Если вы хотите, чтобы Фрагмент был немедленно добавлен, вы хотите использовать commitNow () , что заставляет транзакцию произойти немедленно. Это гарантирует, что это будет сделано до вызова вашего setColor метода:

getSupportFragmentManager()
    .beginTransaction()
    .add(R.id.canvas_fragment, canvas)
    .addToBackStack(null)
    .commitNow();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...