2015-07-30 3 views
0

Это мой пользовательский фрагмент:Почему я могу заменить новый фрагмент, но не инициализированный фрагмент?

Интерфейс:

public interface NotVerifiedWifiCardFragment{ 
    void loadSSIDName(String ssid); 

    void setArguments(Bundle bundle); 
} 

Класс:

public class NotVerifiedWifiCardFragmentImpl extends Fragment implements NotVerifiedWifiCardFragment { 

    private TextView ssid; 
    private View view; 

    //@Inject 
    //NotVerifiedWifiCardPresenter presenter; 

    @Override 
    public void setArguments(Bundle args) { 
     super.setArguments(args); 
    } 

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

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     view = inflater.inflate(R.layout.fragment_card_connected_not_verified, null); 
     return view; 
    } 

    @Override 
    public void onActivityCreated(@Nullable Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     initView(); 
    } 

    private void initView() { 
     ssid = (TextView) view.findViewById(R.id.card_not_verified_wifi_ssid); 

     Bundle bundle = getArguments(); 
     ssid.setText(bundle.getString("SSID")); 
     //presenter.setView(this); 
    } 

    @Override 
    public void loadSSIDName(String ssid) { 
     this.ssid.setText(ssid); 
    } 
} 

Когда я заменить новый CustomFragment с FragmentTransaction я могу сделать это без каких-либо проблем:

@Override 
    public void showNotVerifiedWifiCard(String ssid) { 
     // Begin the transaction 
     FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 

     // Replace the contents of the container with the new fragment 
     ft.setCustomAnimations(R.anim.slide_up_anim, R.anim.slide_down_anim); 
     ft.replace(R.id.main_small_card, new NotVerifiedWifiCardFragmentImpl()); 

     // or ft.add(R.id.your_placeholder, new FooFragment()); 
     // Complete the changes added above 
     ft.commit(); 
    } 

Но когда я пытаюсь позвонить в Фрагме nt Транзакция с тем же фрагментом, но инициализированная (для передачи Bundle), метод replace не позволяет мне. Как вы решаете это, когда вам нужно передать пакет с данными?

@Override 
    public void showNotVerifiedWifiCard(String ssid) { 
     Bundle bundle = new Bundle(); 
     bundle.putString("SSID", ssid); 

     NotVerifiedWifiCardFragment fm = new NotVerifiedWifiCardFragmentImpl(); 
     fm.setArguments(bundle); 

     // Begin the transaction 
     FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 

     // Replace the contents of the container with the new fragment 
     ft.setCustomAnimations(R.anim.slide_up_anim, R.anim.slide_down_anim); 
     ft.replace(R.id.main_small_card, fm); 

     // or ft.add(R.id.your_placeholder, new FooFragment()); 
     // Complete the changes added above 
     ft.commit(); 
    } 

Наверное, это глупый объект, ориентированный на здравый смысл, неправильно понимаемый.

EDIT: показать Ошибка:

Ошибка: Неправильный второй аргумент типа. Найдено: 'com.blabla.NotVerifiedWifiCardFragment', требуется: 'android.support.v4.app.Fragment'

+0

'ft.replace (R.id.main_small_card, фут);' второй аргумент футов опечатка? должно быть fm. – marcinj

+0

Какая ошибка вы получаете? Возможно, @marcinj прав, и это просто опечатка :) –

+0

Это неправильно, это должно быть fm. Я исправлю это! Спасибо. –

ответ

0

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

Например:

class Test implements NotVerifiedWifiCardFragment { 
void loadSSIDName(String ssid){} 

void setArguments(Bundle bundle){} 
.... 
} 

Test просто простой класс, а не фрагмент.

Быстрое решение будет замена

NotVerifiedWifiCardFragment fm = new NotVerifiedWifiCardFragmentImpl(); 

с

NotVerifiedWifiCardFragmentImpl fm = new NotVerifiedWifiCardFragmentImpl() 

То, что вы действительно хотите в этом случае является создание абстрактного Фрагменткласс под названием NotVerifiedWifiCardFragment и делают другие фрагменты простираться Это.

Пример кода

abstract class NotVerifiedWifiCardFragment extends Fragment { 
    abstract void loadSSIDName(String ssid); 
    abstract void setArguments(Bundle bundle); 
} 
0

Если я правильно понял ваш вопрос, вы можете попробовать использовать

public static Fragment instantiate(Context context, String fname, @Nullable Bundle args)

, как это :

NotVerifiedWifiCardFragment fm = (NotVerifiedWifiCardFragment) Fragment.instantiate(context, "some_name", your_args); 
Смежные вопросы