2016-11-18 4 views
0

Ich bin neu in Android und habe angefangen, ein "Navigation Drawer Activity" Projekt zu erstellen. Ich habe meiner activity_main.xml einen TabLayout und ViewPager hinzugefügt und kann nun zwischen verschiedenen Listen wischen. Wenn ich auf ein Element in einer Liste klicke, ruft es onListFragmentInteraction in meiner MainActivity.java auf. Ich habe den folgenden Code ausprobiert, um dynamisch ein Detailfragment hinzuzufügen, wenn ein Benutzer auf ein Element in der Liste klickt, aber ich erhalte diesen Fehler. Meine MainActivity-Klasse implementiert "CustomerFragment.OnListFragmentInteractionListener"Android - TabLayout & ViewPager> Fragmente> OnListFragmentInteractionListener

Erste, ist mein Versuch, ein Detailfragment in einem ViewPager korrekt anzuzeigen? Würde der Code, den ich unten versuche, ein Fragment im aktuellen Tab hinzufügen?

Zweitens, weiß jemand, warum ich diesen Fehler bekomme?

Vielen Dank!

Fehler:

java.lang.RuntimeException: [email protected] must implement OnFragmentInteractionListener

MainActivity:

public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener, TabLayout.OnTabSelectedListener, CustomerFragment.OnListFragmentInteractionListener, GoogleApiClient.OnConnectionFailedListener { 

    private GoogleApiClient mGoogleApiClient; 
    private TabLayout tabLayout; 
    private ViewPager viewPager; 
    private Pager adapter; 

    public void onListFragmentInteraction(Customer customer){ 

      FragmentManager fm = getSupportFragmentManager(); 
      CustomerDetailFragment fragment = CustomerDetailFragment.newInstance(customer); 
      fm.beginTransaction().add(R.id.pager, fragment).commit(); 
    } 

    @Override 
    public void onTabSelected(TabLayout.Tab tab) { 
     viewPager.setCurrentItem(tab.getPosition()); 
    } 

    @Override 
    public void onTabUnselected(TabLayout.Tab tab) { } 

    @Override 
    public void onTabReselected(TabLayout.Tab tab) { } 

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

     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     tabLayout = (TabLayout) findViewById(R.id.tabLayout); 
     tabLayout.addTab(tabLayout.newTab().setText("Home")); 
     tabLayout.addTab(tabLayout.newTab().setText("Customers")); 
     tabLayout.addTab(tabLayout.newTab().setText("Jobs")); 
     tabLayout.setTabGravity(TabLayout.GRAVITY_FILL); 

     viewPager = (ViewPager) findViewById(R.id.pager); 
     adapter = new Pager(getSupportFragmentManager(), tabLayout.getTabCount()); 
     viewPager.setAdapter(adapter); 
     tabLayout.addOnTabSelectedListener(this); 

     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.addDrawerListener(toggle); 
     toggle.syncState(); 

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

     FirebaseMessaging.getInstance().subscribeToTopic("global"); 
     String token = FirebaseInstanceId.getInstance().getToken(); 

     // Check Google Play Services 
     mGoogleApiClient = new GoogleApiClient.Builder(this) 
       .enableAutoManage(this, this) 
       .addApi(Drive.API) 
       .addScope(Drive.SCOPE_FILE) 
       .build(); 

     // test 
     Date d = new Date(); 
     DbHandler dbHandler = new DbHandler(this, null, null, 1); 
     Customer customer = new Customer(1, 1, 1, 1, "Test", "Test", "Test", false, d, 1, d, 1); 
     dbHandler.addCustomer(customer); 
    } 

    @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) { 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     int id = item.getItemId(); 
     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) { 
      startActivity(new Intent(this, LoginActivity.class)); 
     } else if (id == R.id.nav_gallery) { 
      startActivity(new Intent(this, SyncActivity.class)); 
     } 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; 
    } 

    @Override 
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { 

    } 
} 

Kundenliste Fragment:

public class CustomerFragment extends Fragment { 

    private OnListFragmentInteractionListener mListener; 

    public CustomerFragment() { 
    } 

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

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_customer_list, container, false); 

     SearchView sv = (SearchView) view.findViewById(R.id.searchview); 
     RecyclerView rv = (RecyclerView) view.findViewById(R.id.recyclerview); 

     // Adapter 
     rv.setLayoutManager(new LinearLayoutManager(view.getContext())); 
     final CustomerAdapter adapter = new CustomerAdapter(getCustomers(), mListener); 
     rv.setAdapter(adapter); 

     // Search 
     sv.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 
      @Override 
      public boolean onQueryTextSubmit(String query) { 
       return false; 
      } 
      @Override 
      public boolean onQueryTextChange(String query) { 
       //adapter.getFilter().filter(query); 
       return false; 
      } 
     }); 

     return view; 
    } 

    private ArrayList<Customer> getCustomers() { 
     DbHandler dbHandler = new DbHandler(this.getActivity(), null, null, 1); 
     ArrayList<Customer> customers = dbHandler.getCustomers(); 
     return customers; 
    } 

    @Override 
    public void onAttach(Context context) { 
     super.onAttach(context); 
     if (context instanceof OnListFragmentInteractionListener) { 
      mListener = (OnListFragmentInteractionListener) context; 
     } else { 
      throw new RuntimeException(context.toString() + " must implement OnListFragmentInteractionListener"); 
     } 
    } 

    @Override 
    public void onDetach() { 
     super.onDetach(); 
     mListener = null; 
    } 

    public interface OnListFragmentInteractionListener { 
     void onListFragmentInteraction(Customer customer); 
    } 
} 

Kunden Adapter:

public class CustomerAdapter extends RecyclerView.Adapter<CustomerAdapter.ViewHolder> { 

    private final List<Customer> mValues; 
    private final OnListFragmentInteractionListener mListener; 

    public CustomerAdapter(List<Customer> items, OnListFragmentInteractionListener listener) { 
     mValues = items; 
     mListener = listener; 
    } 

    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = LayoutInflater.from(parent.getContext()) 
       .inflate(R.layout.fragment_customer, parent, false); 
     return new ViewHolder(view); 
    } 

    @Override 
    public void onBindViewHolder(final ViewHolder holder, int position) { 
     Customer customer = mValues.get(position); 
     holder.mItem = customer; 
     holder.mIdView.setText(String.valueOf(customer.getId())); 
     holder.mContentView.setText(customer.getCompanyName()); 
     holder.mView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
      if (null != mListener) { 
       mListener.onListFragmentInteraction(holder.mItem); 
      } 
      } 
     }); 
    } 

    @Override 
    public int getItemCount() { 
     return mValues.size(); 
    } 

    public class ViewHolder extends RecyclerView.ViewHolder { 
     public final View mView; 
     public final TextView mIdView; 
     public final TextView mContentView; 
     public Customer mItem; 

     public ViewHolder(View view) { 
      super(view); 
      mView = view; 
      mIdView = (TextView) view.findViewById(R.id.id); 
      mContentView = (TextView) view.findViewById(R.id.content); 
     } 

     @Override 
     public String toString() { 
      return super.toString() + " '" + mContentView.getText() + "'"; 
     } 
    } 
} 

UPDATE: Es sieht so aus, als ob ich onListFragmentInteraction AND onFragmentInteraction hinzufügen musste. Die erste ist für die CustomerListFragment und die zweite ist für die CustomerDetailFragment.

Und die CustomerDetailFragment Arbeit mit den Tabs zu erhalten, folgte ich dies und habe es funktioniert: https://medium.com/@nilan/separate-back-navigation-for-a-tabbed-view-pager-in-android-459859f607e4#.lrjeexdcp

@Override 
public void onListFragmentInteraction(Customer customer){ 
     FragmentManager fm = getSupportFragmentManager(); 
     CustomerDetailFragment fragment = CustomerDetailFragment.newInstance(customer); 
     fm.beginTransaction().add(R.id.pager, fragment).commit(); 
} 

@Override 
public void onFragmentInteraction(Uri uri) { 

} 
+0

Konnten Sie Ihren Tätigkeitscode auch posten? –

Antwort

0

Sie benötigen

public void onListFragmentInteraction(Customer customer){ 
    FragmentManager fm = getSupportFragmentManager(); 
    CustomerDetailFragment fragment = CustomerDetailFragment.newInstance(customer); 
    fm.beginTransaction().add(R.id.pager, fragment).commit(); 
} 

In Ihrem MainActivity Klasse zu setzen, anstatt außerhalb es.

Wenn dies nicht wirklich Ihr Code ist, bearbeiten Sie Ihre Antwort, um die Blöcke aufzuteilen, um genau darzustellen, wie Ihr Code aufgebaut ist, und enthalten Sie Ihre Interfance innerhalb des Fragments für den Listener. Sie können auch die @Override Tag über der onListFragmentInteraction Implementierung benötigen

bearbeiten

Wie ich bereits erwähnt Sie die @Override Tag über der onListFragmentInteraction Implementierung setzen müssen, schauen Sie sich alle anderen Zuhörer Implementierung Sie bereits haben.

+0

@ Primico meine Antwort bearbeitet, werfen Sie einen Blick. –

+0

Ich habe dies versucht, aber immer noch den gleichen Fehler: java.lang.RuntimeException: [email protected] muss OnFragmentInteractionListener bei com.myproject.android.CustomerDetailFragment.onAttach implementieren (CustomerDetailFragment.java:72) – Primico

Verwandte Themen