【问题标题】:Android - TabLayout & ViewPager > Fragments > OnListFragmentInteractionListenerAndroid - TabLayout & ViewPager > Fragments > OnListFragmentInteractionListener
【发布时间】:2016-11-23 00:08:20
【问题描述】:

我是 Android 新手,我开始构建一个“导航抽屉活动”项目。我在我的 activity_main.xml 中添加了 TabLayout 和 ViewPager,现在我可以在不同的列表之间滑动。当我单击列表中的一个项目时,它会在我的 MainActivity.java 中调用 onListFragmentInteraction。当用户单击列表中的项目时,我尝试使用下面的代码动态添加详细信息片段,但出现此错误。我的 MainActivity 类确实“实现 CustomerFragment.OnListFragmentInteractionListener”

首先,我在 ViewPager 中显示细节片段的尝试是否正确?我在下面尝试的代码会在当前选项卡中添加一个片段吗?

其次,有人知道我为什么会收到这个错误吗?

非常感谢!

错误:

java.lang.RuntimeException: com.myproject.android.MainActivity@186e12d 必须实现 OnFragmentInteractionListener

主活动:

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() + "'";
        }
    }
}

更新:看来我需要同时添加 onListFragmentInteraction 和 onFragmentInteraction。第一个用于 CustomerListFragment,第二个用于 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) {

}

【问题讨论】:

  • 您也可以发布您的活动代码吗?

标签: android android-fragments


【解决方案1】:

你需要放

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

在您的 MainActivity 类内而不是在它之外。

如果您的代码实际上不是这样,请编辑您的答案以分解块以准确表示您的代码是如何构建的,并将您的接口包含在侦听器的片段中。您可能还需要 onListFragmentInteraction 实现上方的 @Override 标签

编辑

正如我上面提到的,您需要将@Override 标记放在onListFragmentInteraction 实现之上,看看您已经拥有的所有其他侦听器实现。

【讨论】:

  • 我试过这个但仍然得到同样的错误:java.lang.RuntimeException: com.myproject.android.MainActivity@4a2f910 must implement OnFragmentInteractionListener at com.myproject.android.CustomerDetailFragment.onAttach(CustomerDetailFragment.java :72)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多