Eu tenho um aplicativo gerado por assistente com gaveta de navegação no android studio 0.8.2
Eu criei um fragmento e o adicionei com newInstance () e recebo este erro:
com.domain.myapp E / AndroidRuntime, EXCEÇÃO FATAL: java.lang.ClassCastException principal: com.domain.myapp.MainActivity@422fb8f0 deve implementar OnFragmentInteractionListener
Não consigo encontrar em nenhum lugar como implementar este OnFragmentInteractionListener ?? Ele não pode ser encontrado nem na documentação do Android SDK!
MainActivity.java
import android.app.Activity;
import android.app.ActionBar;
import android.app.Fragment;
import android.app.FragmentManager;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.support.v4.widget.DrawerLayout;
public class MainActivity extends Activity
implements NavigationDrawerFragment.NavigationDrawerCallbacks {
/**
* Fragment managing the behaviors, interactions and presentation of the navigation drawer.
*/
private NavigationDrawerFragment mNavigationDrawerFragment;
/**
* Used to store the last screen title. For use in {@link #restoreActionBar()}.
*/
private CharSequence mTitle;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mNavigationDrawerFragment = (NavigationDrawerFragment)
getFragmentManager().findFragmentById(R.id.navigation_drawer);
mTitle = getTitle();
// Set up the drawer.
mNavigationDrawerFragment.setUp(
R.id.navigation_drawer,
(DrawerLayout) findViewById(R.id.drawer_layout));
}
@Override
public void onNavigationDrawerItemSelected(int position) {
// update the main content by replacing fragments
FragmentManager fragmentManager = getFragmentManager();
switch (position) {
case 0: fragmentManager.beginTransaction()
.replace(R.id.container, PlaceholderFragment.newInstance(position + 1))
.commit(); break;
case 1: fragmentManager.beginTransaction()
.replace(R.id.container, AboutFragment.newInstance("test1", "test2"))
.commit(); break; // this crashes the app
case 2: fragmentManager.beginTransaction()
.replace(R.id.container, BrowseQuotesFragment.newInstance("test1", "test2"))
.commit(); break; // this crashes the app
}
}
public void onSectionAttached(int number) {
switch (number) {
case 1:
mTitle = getString(R.string.title_section1);
break;
case 2:
mTitle = getString(R.string.title_section2);
break;
case 3:
mTitle = getString(R.string.title_section3);
break;
}
}
public void restoreActionBar() {
ActionBar actionBar = getActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
actionBar.setDisplayShowTitleEnabled(true);
actionBar.setTitle(mTitle);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
if (!mNavigationDrawerFragment.isDrawerOpen()) {
// Only show items in the action bar relevant to this screen
// if the drawer is not showing. Otherwise, let the drawer
// decide what to show in the action bar.
getMenuInflater().inflate(R.menu.main, menu);
restoreActionBar();
return true;
}
return super.onCreateOptionsMenu(menu);
}
@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();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
/**
* A placeholder fragment containing a simple view.
*/
public static class PlaceholderFragment extends Fragment {
/**
* The fragment argument representing the section number for this
* fragment.
*/
private static final String ARG_SECTION_NUMBER = "section_number";
/**
* Returns a new instance of this fragment for the given section
* number.
*/
public static PlaceholderFragment newInstance(int sectionNumber) {
PlaceholderFragment fragment = new PlaceholderFragment();
Bundle args = new Bundle();
args.putInt(ARG_SECTION_NUMBER, sectionNumber);
fragment.setArguments(args);
return fragment;
}
public PlaceholderFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, container, false);
return rootView;
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
((MainActivity) activity).onSectionAttached(
getArguments().getInt(ARG_SECTION_NUMBER));
}
}
}
fonte
onAttach(Activity activity);
foi descontinuado e substituído poronAttach(Context context)
onAttach(context)
iria funcionar bemPara aqueles que ainda não entendem depois de lerem a resposta @meda, aqui está minha explicação concisa e completa para esse problema:
Digamos que você tenha 2 fragmentos
Fragment_A
eFragment_B
que são gerados automaticamente a partir do aplicativo. Na parte inferior dos fragmentos gerados, você encontrará este código:Para superar o problema, você deve adicionar um
onFragmentInteraction
método à sua atividade, que no meu caso é nomeadaMainActivity2
. Depois disso, você precisa deimplements
todos os fragmentosMainActivity
assim:PS: Em resumo, esse método pode ser usado para a comunicação entre fragmentos. Para aqueles que desejam saber mais sobre esse método, consulte este link .
fonte
onFragmentIntereactior(Uri)
método, que não é mencionado em nenhuma das outras respostas. 1Veja o seu gerado automaticamente
Fragment
criado pelo Android Studio. Quando você criou o novoFragment
, o Studio colocou um monte de código para você. Na parte inferior do modelo gerado automaticamente, há uma definição de interface interna chamadaOnFragmentInteractionListener
. SuasActivity
necessidades para implementar essa interface. Esse é o padrão recomendado para vocêFragment
notificar seusActivity
eventos, para que ele possa tomar as ações apropriadas, como carregar outroFragment
. Consulte esta página para obter detalhes, procure a seção "Criando retornos de chamada de evento para a atividade": http://developer.android.com/guide/components/fragments.htmlfonte
Activity
é anexada aoFragment
. A falha que você está vendo é porque o seuActivity
não implementou a interface. Você precisa entrar no seuActivity
e adicionar umimplements YourFragment.OnFragmentInteractionListener
e adicionar uma implementação do método definido na interface.onFragmentInteraction(Uri uri)
é apenas um esboço. Você pode fazer esse método o que quiser e suasActivity
necessidades para implementá-lo. Veja se isso ajuda.Para aqueles que visitam esta página procurando mais esclarecimentos sobre esse erro, no meu caso, a atividade que fez a chamada para o fragmento precisava ter 2 implementos neste caso, como este:
fonte
Você deve tentar remover o seguinte código dos seus fragmentos
A interface / ouvinte é um padrão criado para que sua atividade e fragmentos possam se comunicar com mais facilidade
fonte
Além da resposta de @ user26409021, se você adicionou um ItemFragment, a mensagem no ItemFragment é;
E você deve adicionar sua atividade;
Aqui, o item fictício é o que você tem na parte inferior do ItemFragment
fonte
Comigo funcionou excluir este código:
Terminando assim:
fonte
OnFragmentInteractionListener
é a implementação padrão para manipular comunicação de fragmento para atividade. Isso pode ser implementado com base em suas necessidades. Suponha que, se você precisar que uma função em sua atividade seja executada durante uma ação específica em seu fragmento, você poderá fazer uso desse método de retorno de chamada. Se você não precisar ter essa interação entre sua hospedagemactivity
efragment
, poderá remover esta implementação.Em resumo, você deve
implement
ouvir o ouvinte em sua atividade de hospedagem de fragmentos, se precisar da interação atividade-fragmento como estae seu fragmento deve defini-lo assim
também forneça definição para
void onFragmentInteraction(Uri uri);
em sua atividadeou então remova a
listener
inicialização do seu fragmentoonAttach
se você não tiver nenhuma interação atividade-fragmentofonte
Em vez de Atividade, use o contexto. Funciona para mim.
fonte
Apenas um adendo:
OnFragmentInteractionListener controla a comunicação entre Activity e Fragment usando uma interface (OnFragmentInteractionListener) e é criado por padrão pelo Android Studio, mas se você não precisar se comunicar com sua atividade, pode simplesmente aproveitá-la.
O objetivo é que você possa anexar seu fragmento a várias atividades e ainda reutilizar a mesma abordagem de comunicação (cada atividade pode ter seu próprio OnFragmentInteractionListener para cada fragmento).
Mas e se tiver certeza de que meu fragmento será anexado a apenas um tipo de atividade e eu quero me comunicar com essa atividade?
Então, se você não quiser usar OnFragmentInteractionListener devido à sua verbosidade, poderá acessar seus métodos de atividade usando:
fonte
Basta ir ao seu fragmento Activity e remover todo o método ..... em vez disso, no método createview.
seu fragmento possui apenas o método oncreateview.
// somente este método implementa outro método delete
e verifique se o layout é demo para você.
fonte
Eu gostaria de adicionar a destruição do ouvinte quando o fragmento é desanexado da atividade ou destruído.
e ao usar o novo método onStart () com Context
fonte