@AleDv

Почему не конвертируются Fragment?

Здравствуйте, друзья. Изучаю разработку приложений под Android, приступил к изучению фрагментов.

Суть: есть главная активити и два фрагмента на ней. Задача: использовать FragmentManager для общения фрагментов между собой.

Код активити:
package com.example.myfragment;

import android.app.Activity;
import android.app.FragmentManager;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.support.v4.app.FragmentActivity;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.support.v4.app.Fragment;


public class MainActivity extends Activity implements Fragment1.OnSelectedButtonListener{


    @Override
    public void onButtonSelected(int buttonIndex) {
        // вызываем менеджер фрагментов
        FragmentManager fragmentManager = getSupportFragmentManager;

        // Получаем ссылку на второй фрагмент по ID
        Fragment2 fragment2 = (Fragment2) fragmentManager.findFragmentById(R.id.fragment2);

        // Выводим нужную информацию
        if (fragment2 != null)
            fragment2.setDescription(buttonIndex);
    }

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



    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    public void Button1Click(View view){
        Button btn = (Button)findViewById(R.id.button1);
        TextView tv = (TextView)findViewById(R.id.textView1);
        ImageView iv = (ImageView)findViewById(R.id.imageView1);

        tv.setText(btn.getText());
        //BitmapDrawable bd = getResources().getDrawable(R.drawable.paint1);
        Drawable img = getResources().getDrawable(R.drawable.paint1);
        iv.setImageDrawable(img);
    }

    public void Button2Click(View view){
        Button btn = (Button)findViewById(R.id.button2);
        TextView tv = (TextView)findViewById(R.id.textView1);
        ImageView iv = (ImageView)findViewById(R.id.imageView1);

        tv.setText(btn.getText());
        //BitmapDrawable bd = getResources().getDrawable(R.drawable.paint1);
        Drawable img = getResources().getDrawable(R.drawable.paint2);
        iv.setImageDrawable(img);
    }

    public void Button3Click(View view){
        Button btn = (Button)findViewById(R.id.button3);
        TextView tv = (TextView)findViewById(R.id.textView1);
        ImageView iv = (ImageView)findViewById(R.id.imageView1);

        tv.setText(btn.getText());
        //BitmapDrawable bd = getResources().getDrawable(R.drawable.paint1);
        Drawable img = getResources().getDrawable(R.drawable.paint3);
        iv.setImageDrawable(img);
    }


}


Кода первого фрагмента:

package com.example.myfragment;

import android.os.Bundle;
import android.support.annotation.Nullable;
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.Toast;


public class Fragment1 extends Fragment implements View.OnClickListener{

    public interface OnSelectedButtonListener{
        void onButtonSelected(int buttonIndex);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        //return super.onCreateView(inflater, container, savedInstanceState);
        View rootView = inflater.inflate(R.layout.fragment1, container, false);
        Button button1 = (Button) rootView.findViewById(R.id.button1);
        Button button2 = (Button) rootView.findViewById(R.id.button2);
        Button button3 = (Button) rootView.findViewById(R.id.button3);

        button1.setOnClickListener(this);
        button2.setOnClickListener(this);
        button3.setOnClickListener(this);

        return rootView;
    }

    @Override
    public void onClick(View v) {
        // Обрабатываем нажатия на кнопки
        int buttonIndex = translateToIndex(v.getId());

        OnSelectedButtonListener listener = (OnSelectedButtonListener) getActivity();
        listener.onButtonSelected(buttonIndex);
        //Toast.makeText(getActivity(), String.valueOf(buttonIndex), Toast.LENGTH_LONG).show();

    }


    int translateToIndex(int id){
        int index = -1;
        switch(id){
            case R.id.button1:
                index = 1; break;
            case R.id.button2:
                index = 2; break;
            case R.id.button3:
                index = 3; break;
        }
         return index;
    }

}


Код второго фрагмента:
package com.example.myfragment;

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

public class Fragment2 extends Fragment {
    private TextView mInfoTextView;
    private ImageView mCatImageView;
    private String[] mCatDescriptionArray;


    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        //return super.onCreateView(inflater, container, savedInstanceState);
        View rootView = inflater.inflate(R.layout.fragment2, container, false);

        mInfoTextView = (TextView) rootView.findViewById(R.id.textView1);
        mCatImageView = (ImageView) rootView.findViewById(R.id.imageView1);

        mCatDescriptionArray = getResources().getStringArray(R.array.cats);

        return rootView;
    }

    public void setDescription(int buttonIndex){
        String catDescription = mCatDescriptionArray[buttonIndex];
        mInfoTextView.setText(catDescription);

        switch (buttonIndex){
            case 1:
                mCatImageView.setImageResource(R.drawable.paint1);
                break;
            case 2:
                mCatImageView.setImageResource(R.drawable.paint2);
                break;
            case 3:
                mCatImageView.setImageResource(R.drawable.paint3);
                break;

            default:
                break;

        }


    }
}


Проблема:
1) Компилятор ругается на вызов функции getSupportFragmentManager.
2) ошибка при конвертации Error:(28, 75) error: incompatible types: Fragment cannot be converted to Fragment2

Обе ошибки в коде главной активности. Подскажите, пожалуйста, где я ошибся.

P.S. пишу по developer.alexanderklimov.ru/android/fragment.php
  • Вопрос задан
  • 4005 просмотров
Решения вопроса 1
ProgramCodePav
@ProgramCodePav
Front-end developer. Love open source
Обратите внимание на используемые библиотеки. Если вы использует Support Library (для поддержки старых версий Android), то типы должны быть из соответствующих библиотек. Например:

Из первого листинга видно, что фрагмент менеджер не входит в библиотеку Support, а фрагмент - входит.

import android.app.Activity;
import android.app.FragmentManager;
...
import android.support.v4.app.Fragment;


Функций getSupportFragmentManager() применяется к классам из Support library.

ps: для фрагмент менеджера: import android.support.v4.app.FragmentManager;
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
kivsiak
@kivsiak
software engineer
docs.oracle.com/javase/tutorial
docs.oracle.com/javase/tutorial/java/IandI/subclas... раздел про casting.

Пока не разберетесь с языком хотя бы на core уровне лучше в андроид не лезть.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы