简体   繁体   English

Android-TabLayout和ViewPager>片段> OnListFragmentInteractionListener

[英]Android - TabLayout & ViewPager > Fragments > OnListFragmentInteractionListener

I'm new to Android and I started building a "Navigation Drawer Activity" project. 我是Android新手,因此开始构建“导航抽屉活动”项目。 I added a TabLayout and ViewPager to my activity_main.xml and now I can swipe between different lists. 我在Activity_main.xml中添加了TabLayout和ViewPager,现在可以在不同列表之间滑动。 When I click an item in a list, it calls onListFragmentInteraction in my MainActivity.java. 当我单击列表中的项目时,它会在MainActivity.java中调用onListFragmentInteraction。 I tried the code below to dynamically add a Detail fragment when a user clicks an item in the list, but I get this error. 我尝试使用下面的代码在用户单击列表中的项目时动态添加一个Detail片段,但出现此错误。 My MainActivity class does "implement CustomerFragment.OnListFragmentInteractionListener" 我的MainActivity类执行“ CustomerFragment.OnListFragmentInteractionListener”

First , is my attempt at showing a detail fragment inside a ViewPager correct? 首先 ,我在ViewPager中显示详细片段的尝试是否正确? Would the code I am attempting below add a fragment in the current tab? 我在下面尝试的代码是否会在当前选项卡中添加一个片段?

Secondly , does anyone know why I am getting this error? 其次 ,有人知道我为什么会收到此错误吗?

Thanks so much! 非常感谢!

Error: 错误:

java.lang.RuntimeException: com.myproject.android.MainActivity@186e12d must implement OnFragmentInteractionListener java.lang.RuntimeException:com.myproject.android.MainActivity@186e12d必须实现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) {

    }
}

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

Customer 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: It looks like I needed to add both onListFragmentInteraction AND onFragmentInteraction. 更新:看来我需要同时添加onListFragmentInteraction和onFragmentInteraction。 The first is for the CustomerListFragment and the 2nd is for the CustomerDetailFragment. 第一个用于CustomerListFragment,第二个用于CustomerDetailFragment。

And to get the CustomerDetailFragment working with the tabs, I followed this and got it working: https://medium.com/@nilan/separate-back-navigation-for-a-tabbed-view-pager-in-android-459859f607e4#.lrjeexdcp 为了使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) {

}

You need to put 你需要放

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

Inside your MainActivity class instead of outside of it. 在您的MainActivity类内部,而不是外部。

If that's not actually how your code is, edit your answer to break up the blocks to accurately represent how your code is built and include your interfance inside the fragment for the listener. 如果这实际上不是您的代码的方式,请编辑您的答案以分解这些块,以准确地表示您的代码是如何构建的,并在您的侦听器片段中包含您的接口。 You also may need the @Override tag above the onListFragmentInteraction implementation 您可能还需要在@Override上述标签onListFragmentInteraction实施

Edit 编辑

As I mentioned above you need to put the @Override tag above the onListFragmentInteraction implementation, look at every other listener implementation you already have. 正如我上面提到的,你需要把@Override标签上面onListFragmentInteraction落实,看你已经有了每隔监听器实现。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM