簡體   English   中英

Android-TabLayout和ViewPager>片段> OnListFragmentInteractionListener

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

我是Android新手,因此開始構建“導航抽屜活動”項目。 我在Activity_main.xml中添加了TabLayout和ViewPager,現在可以在不同列表之間滑動。 當我單擊列表中的項目時,它會在MainActivity.java中調用onListFragmentInteraction。 我嘗試使用下面的代碼在用戶單擊列表中的項目時動態添加一個Detail片段,但出現此錯誤。 我的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) {

}

你需要放

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

在您的MainActivity類內部,而不是外部。

如果這實際上不是您的代碼的方式,請編輯您的答案以分解這些塊,以准確地表示您的代碼是如何構建的,並在您的偵聽器片段中包含您的接口。 您可能還需要在@Override上述標簽onListFragmentInteraction實施

編輯

正如我上面提到的,你需要把@Override標簽上面onListFragmentInteraction落實,看你已經有了每隔監聽器實現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM