【问题标题】:Can not show Toast in OnItemClickListener inside Fragment无法在 Fragment 内的 OnItemClickListener 中显示 Toast
【发布时间】:2015-09-15 22:51:43
【问题描述】:

我正在尝试在 Fragment 中创建 ListView。 listView 显示正确,但是当我编译代码时显示错误。

    import android.app.Fragment;
    import android.content.Context;
    import android.os.Bundle;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.AdapterView;
    import android.widget.ArrayAdapter;
    import android.widget.ListView;
    import android.widget.Toast;

    public class ServiceFragment extends Fragment {
        private ListView serviceList;
        private String[] serviceString;
        public ServiceFragment(){}


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

           //build the list service
            serviceList = (ListView) rootView.findViewById(R.id.ServiceList);
            serviceString = getResources().getStringArray(R.array.service_list);

            ArrayAdapter<String> objAdapter = new ArrayAdapter<String>(this.getActivity(), android.R.layout.simple_list_item_1,serviceString );
            serviceList.setAdapter(objAdapter);

           //on click item Listener
           serviceList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
             @Override
             public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                String  itemValue    = (String) serviceList.getItemAtPosition(position);
                int itemPosition     = position;

                Toast.makeText(ServiceFragment.this,"Position :"+itemPosition+"  ListItem : " +itemValue , Toast.LENGTH_LONG).show();

             }
          });

         return rootView;
        }//end of onCreateView

}//end of class ServiceFragment

我的代码有什么问题?为什么Toast 没有出现?

是否可以在单击项目时启动详细活动,我可以在其中描述项目的含义

假设 清单项目 = 苹果、芒果、香蕉 onClick Item Details view = 苹果是品牌还是水果,香蕉是水果,芒果是好水果,

【问题讨论】:

  • “但是当我点击代码时显示错误”。错误在哪里?顺便说一句,试试这个吐司Toast.makeText(getActivity(),"Position :"+itemPosition+" ListItem : " +itemValue , Toast.LENGTH_LONG).show();
  • 感谢这个 Toast 工作!是否可以在点击项目开始详细活动,我可以描述项目的含义
  • 你能给我举个例子吗?我在这个领域很新,并尝试学习。
  • 是啊太棒了...谢谢你们两个!!!!!
  • 不客气,我们一起做的 ;)

标签: android android-fragments android-toast


【解决方案1】:

我的代码有什么问题?为什么 Toast 不显示

由于您使用的是Fragment,因此您必须使用getActivity() 而不是yourClass.this

将您的 Toast 更改为:

Toast.makeText(getActivity(),"Position :"+itemPosition+" ListItem : " +itemValue , Toast.LENGTH_LONG).show();

编辑

对于一个详细的活动,您必须首先创建一个Activity,我们将其命名为DetailActivity,然后您必须将您的onItemClickListener() 更改为:

 serviceList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
         @Override
         public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            String  itemValue    = (String) serviceList.getItemAtPosition(position);
            int itemPosition     = position;

            Toast.makeText(getActivity(),"Position :"+itemPosition+"  ListItem : " +itemValue , Toast.LENGTH_LONG).show();

          Intent intent = new Intent(getActivity(), DetailActivity.class);
          intent.putExtra("DetailProductClicked", itemValue);
          startActivity(intent);

         }
      });

所以在你的DetailActivity.class 中你必须把它放在你的onCreate()

String nameFruit = intent.getStringExtra("DetailProductClicked");

然后取决于你对这个Activity 有什么,你可以做类似的事情:

if (nameFruit.equals("Apple"){
   tv.setText(nameFruit +" is a brand or fruit");
}
if (nameFruit.equals("Mango"){
   tv.setText(nameFruit +" is a good fruit");
}
if (nameFruit.equals("Banana"){
   tv.setText(nameFruit +" is a fruit");
}

【讨论】:

    【解决方案2】:

    要跟进 @Skizo 的回答,请将您的 onItemClick 更改为

      serviceList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
             @Override
             public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                String  itemValue    = (String) serviceList.getItemAtPosition(position);
                int itemPosition     = position;
    
                Intent nextIntent = new Intent(getActivity(), MyNextActivity.class); 
                 // ... create a bundle to pass of the Object in your data at itemPosition
                startActivity(nextIntent);
    
             }
          });
    

    实际上,虽然我会像这样在 Fragment 中使用接口并告诉我的 Activity 启动新的 Activity 而不是 Fragment:

        import android.app.Fragment;
    import android.content.Context;
    import android.os.Bundle;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.AdapterView;
    import android.widget.ArrayAdapter;
    import android.widget.ListView;
    import android.widget.Toast;
    
    public class ServiceFragment extends Fragment {
        private ListView serviceList;
        private String[] serviceString;
        private ItemListener mCallback;
        public ServiceFragment(){}
    
    
        public interface ItemListener{
             // use position or Object data here
             void onItemClicked(int position);
        }
    
        @Override
        public void onAttach(Activity activity){
            super.onAttach(activity);
    
            mCallback = (ItemListener) activity;
        }
    
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
         Bundle savedInstanceState) {
         View rootView = inflater.inflate(R.layout.fragment_service, container, false);
    
           //build the list service
            serviceList = (ListView) rootView.findViewById(R.id.ServiceList);
            serviceString = getResources().getStringArray(R.array.service_list);
    
            ArrayAdapter<String> objAdapter = new ArrayAdapter<String>(this.getActivity(), android.R.layout.simple_list_item_1,serviceString );
            serviceList.setAdapter(objAdapter);
    
           //on click item Listener
           serviceList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
             @Override
             public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                String  itemValue    = (String) serviceList.getItemAtPosition(position);
                int itemPosition     = position;
    
                mCallback.onItemClicked(itemPosition);
    
             }
          });
    
         return rootView;
        }//end of onCreateView
    
    }//end of class ServiceFragment
    

    然后在您的活动中添加implements ServiceFragment.ItemListener

     @Override
     public void onItemClicked(int position){
         // Now handling this element via the Activity, much cleaner
         Intent nextIntent = new Intent(this, MyNextActivity.class); 
                 // ... create a bundle to pass of the Object in your data at itemPosition
                startActivity(nextIntent);
    
     }
    

    【讨论】:

    • 非常感谢。
    • @RupomKhondaker 查看更新,使用界面并保持片段代码精简
    • 也许是 startActivity(nextIntent); 而不是 startActivity(newIntent); 对吗?
    猜你喜欢
    • 2014-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-01
    • 2012-06-01
    相关资源
    最近更新 更多