2016-02-10 6 views
0

Так что я делаю то, что говорит this. У меня есть MainActivity с навигационным ящиком.Фрагменты, что я делаю неправильно?

Это мой MainActivity.java

package nl.broekhin.magizon; 


import android.app.Activity; 
import android.os.Bundle; 
import android.support.design.widget.FloatingActionButton; 
import android.support.design.widget.NavigationView; 
import android.support.design.widget.Snackbar; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentTransaction; 
import android.support.v4.view.GravityCompat; 
import android.support.v4.widget.DrawerLayout; 
import android.support.v7.app.ActionBarDrawerToggle; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.Toolbar; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 

import layout.LoginFragment; 
import layout.RoosterFragment; 

public class MainActivity extends AppCompatActivity 
     implements NavigationView.OnNavigationItemSelectedListener { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
     fab.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) 
         .setAction("Action", null).show(); 
      } 
     }); 

     DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
     ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
       this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); 
     drawer.setDrawerListener(toggle); 
     toggle.syncState(); 

     NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); 
     navigationView.setNavigationItemSelectedListener(this); 




     LoginFragment loginFragment = new LoginFragment(); 
     RoosterFragment roosterFragment = new RoosterFragment(); 

     getSupportFragmentManager().beginTransaction() 
       .add(R.id.fragment_container, loginFragment).commit(); 
    } 



    public interface OnFragmentInteractionListener { 
     //public void onFragmentMessage(String TAG, Object data); 
    } 

    @Override 
    public void onBackPressed() { 
     DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
     if (drawer.isDrawerOpen(GravityCompat.START)) { 
      drawer.closeDrawer(GravityCompat.START); 
     } else { 
      super.onBackPressed(); 
     } 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.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); 
    } 

    @SuppressWarnings("StatementWithEmptyBody") 
    @Override 
    public boolean onNavigationItemSelected(MenuItem item) { 
     // Handle navigation view item clicks here. 
     int id = item.getItemId(); 

     if (id == R.id.nav_camera) { 
      // Handle the camera action 
     } else if (id == R.id.nav_gallery) { 

     } else if (id == R.id.nav_slideshow) { 

     } else if (id == R.id.nav_manage) { 

     } else if (id == R.id.nav_share) { 

     } else if (id == R.id.nav_send) { 

     } 

     DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
     drawer.closeDrawer(GravityCompat.START); 
     return true; 
    } 


} 

Это мой content_main.xml:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    app:layout_behavior="@string/appbar_scrolling_view_behavior" 
    tools:context="nl.broekhin.magizon.MainActivity" 
    tools:showIn="@layout/app_bar_main"> 

    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/fragment_container" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 


</RelativeLayout> 

Однако, когда я пытаюсь запустить это, я получаю сообщение об ошибке.

java.lang.RuntimeException: Невозможно запустить активность ComponentInfo {nl.broekhin.magizon/nl.broekhin.magizon.MainActivity}: java.lang.RuntimeException: [email protected] должен реализовать OnFragmentInteractionListener

+0

Опубликуйте MainActivity.java –

+0

@DougStevenson Готово! – Tvde1

+0

проблема лежит в источнике фрагмента, пожалуйста, напишите его. –

ответ

0

Я решил это!

Видимо, мне пришлось использовать android.support.v4.app.Fragment; вместо android.app.Fragment;. Это код, который я получил его на работу с:

protected void setFragment(Fragment fragment) { 
    android.support.v4.app.FragmentTransaction t = getSupportFragmentManager().beginTransaction(); 
    t.replace(R.id.fragment_container, fragment); 
    t.commit(); 
} 

И установить его (от навигационной панели onNavigationItemSelected(), вы делаете это:

setFragment(new RoosterFragment()); 

Я надеюсь, что это помогает другим с тем же расстраивает проблема.

-1

Я думаю, вы должны реализовать интерфейс OnFragmentIntractionListner в вашей деятельности ..

+0

я попытался запустить его снова с 'общедоступного интерфейса OnFragmentIn teractionListener { } 'Но он не работает – Tvde1

0

вы добавили кусок кода где-нибудь, который проверяет MainActivity является экземпляром OnFragmentInteractio nListener?

Если вы хотите установить связь между Activity и Fragment, ваша деятельность должна реализовать интерфейс, который определяет Fragment для запроса.

В вашем случае в вашем MainActivity после определения класса:

Class MainActivity extends Activity { 

вы должны сделать это реализовать ваш OnFragmentInteractionListener интерфейс таким образом:

Class MainActivity extends Activity implements OnFragmentInteractionListener { 

После реализации интерфейса, вы обязаны реализовать методы, определяемые интерфейсом, которые вы будете IDE, поможет вам как это сделать.

+0

Я не понимаю, что это делает. Я просто хочу, чтобы страница менялась, когда я нажимаю кнопку. Мне не нужно отправлять информацию. – Tvde1

+0

Можете ли вы, пожалуйста, указать источник вашей деятельности. Если вы не хотите связываться между фрагментом и активностью, вы должны просто удалить проверку для OnFragmentInteractionListener из вашего регистрационного фрагмента. –

+0

Сделано! Я надеюсь, что это поможет – Tvde1

0

В вашем LoginFragment вы делаете где-то следующий кастинг,

(OnFragmentInteractionListener)getActivity() 

Однако ваш MainActivity не реализует интерфейс OnFragmentInteractionListener (даже если вы определили его). Решение прост. Изменение,

public class MainActivity extends AppCompatActivity 
    implements NavigationView.OnNavigationItemSelectedListener { 

в

public class MainActivity extends AppCompatActivity 
    implements NavigationView.OnNavigationItemSelectedListener,OnFragmentInteractionListener { 
0

Вы можете разместить свой фрагмент логин?

Я думаю, проблема в том, что вы раздуваете неправильный файл макета в своей деятельности. Пожалуйста, проверьте завышенный файл. В вашей деятельности это говорит R.layout.activity_main, но вы назвали свой xml как content_main.xml

+0

Это просто пустой фрагмент. Я его вообще не редактировал. – Tvde1

+0

Обновлен мой вопрос, проверьте это и дайте мне некоторую обратную связь –

+0

Нет, он по-прежнему дает мне такую ​​же ошибку. – Tvde1

Смежные вопросы