2016-11-18 20 views
0

私は、Androidに新たなんだと私は「ナビゲーションドロワーアクティビティ」プロジェクトを構築し始めました。私は、tabLayoutとViewPagerをactivity_main.xmlに追加しました。これで、異なるリスト間でスワイプすることができます。リスト内の項目をクリックすると、MainActivity.java内のonListFragmentInteractionが呼び出されます。ユーザーがリスト内の項目をクリックしたときにDetailフラグメントを動的に追加するために以下のコードを試しましたが、このエラーが発生します。私のMainActivityクラスは "CustomerFragment.OnListFragmentInteractionListenerを実装します"アンドロイド - TabLayout&ViewPager>フラグメント> OnListFragmentInteractionListener

最初のは、ViewPager内の詳細フラグメントを正しく表示しようとしていますか?下のコードで、現在のタブにフラグメントを追加しますか?私はこのエラーを取得していますなぜ

第二は、誰もが知っているのですか?

ありがとうございます!

エラー:

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) { 

    } 
} 

顧客リストのフラグメント:

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); 
    } 
} 

カスタマーアダプタ:

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:私はonListFragmentInteractionとonFragmentInteractionの両方を追加するために必要なように見えます。最初はCustomerListFragment、2番目はCustomerDetailFragmentです。

そしてCustomerDetailFragmentタブで作業を取得するためには、私はこれを踏襲し、それが働いてしまった: 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

また、あなたのアクティビティコードを投稿してもらえますか? –

答えて

0

あなたのMainActivityクラスの代わりの内外

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

を配置する必要がありますそれ。それはあなたのコードがどのように実際にはない場合

は、正確にあなたのコードをビルドし、リスナーのフラグメント中にあなたinterfanceが含まれているかを表すためにブロックを壊すためにあなたの答えを編集します。またonListFragmentInteraction実装

編集

私はあなたが、onListFragmentInteraction実装上@Overrideタグを入れて、あなたが既に持っている他のすべてのリスナーの実装を見てする必要があります上記のように、上記@Overrideタグが必要な場合があります。

+0

@Primicoは私の答えを編集しました。 –

+0

これを試しましたが、同じエラーが発生します。java.lang.RuntimeException:[email protected]は、com.myproject.android.CustomerDetailFragment.onAttach(CustomerDetailFragment.java:72)でOnFragmentInteractionListener を実装する必要があります。 – Primico

関連する問題