【问题标题】:broadcastlistener can`t get intent from listview adapter in fragment广播侦听器无法从片段中的列表视图适配器获取意图
【发布时间】:2015-01-25 01:39:51
【问题描述】:

我有一个在标签结构中设置的片段

其中一个片段,我有一个垂直列表视图

另外在每个垂直的listview项目中,我都有一个水平的listviews。

问题是.. 当我在水平适配器中声明一个意图广播器时

并且还在主片段中声明了广播侦听器,但侦听器似乎没有在听意图

请帮帮我...我是韩国学生..

这是我的简要代码

[在水平适配器中]

...

public View getView(int position, View convertView, ViewGroup parent) {

    View retval = convertView;

    if(convertView==null)       // initialize
    {
        retval = LayoutInflater.from(parent.getContext()).inflate(R.layout.part_item, null);

        TextView tv_workout = (TextView)retval.findViewById(R.id.txt_work);
        ImageView iv_workout = (ImageView)retval.findViewById(R.id.pic_work);

        tv_workout.setText(getItem(rowpos).get(position).getPartname());
        iv_workout.setImageResource(getItem(rowpos).get(position).getImagesrc());

        iv_workout.setTag(position);
        iv_workout.setOnTouchListener(new OnTouchListener() 
        {
            @Override
            public boolean onTouch(View v, MotionEvent event) {

                if((int)v.getTag() == getCount()-1)
                {   
                    PartContent temp_part = new PartContent("part", R.drawable.plus);
                    PartContent temp_base_part = new PartContent("workout", R.drawable.dumb);


                    totallist.get(rowpos).set(getCount()-1, temp_base_part);
                    totallist.get(rowpos).add(temp_part);

                    Intent intent = new Intent();
                    intent.setClass(getContext(), FragRoutine.class);
                    intent.putExtra("row", rowpos);
                    intent.putExtra("col", (int) v.getTag());
                    getContext().sendBroadcast(intent);


                    //Toast.makeText(getContext(), "one more hour!" , Toast.LENGTH_SHORT).show();
                    getView((int)v.getTag(), (View)v.getParent(), (ViewGroup)v.getParent().getParent());

                    //FragRoutine fr = new FragRoutine();
                    //fr.TotalList.get(rowpos).set(getCount() - 1, temp_base_part);
                    //fr.TotalList.get(rowpos).add(temp_part);

                }
                return true;
            }
        });

    }

    else 
    {
        TextView tv_workout = (TextView)convertView.findViewById(R.id.txt_work);
        ImageView iv_workout = (ImageView)convertView.findViewById(R.id.pic_work);

        tv_workout.setText(getItem(rowpos).get(position).getPartname());
        iv_workout.setImageResource(getItem(rowpos).get(position).getImagesrc());

        iv_workout.setTag(position);
        iv_workout.setOnTouchListener(new OnTouchListener() 
        {
            @Override
            public boolean onTouch(View v, MotionEvent event) {

                if((int)v.getTag() == getCount() - 1)
                {   
                    PartContent temp_part = new PartContent("part", R.drawable.plus);
                    PartContent temp_base_part = new PartContent("part", R.drawable.dumb);

                    totallist.get(rowpos).set(getCount()-1, temp_base_part);
                    totallist.get(rowpos).add(temp_part);

                    Intent intent = new Intent();
                    //intent.setClass(getContext(), FragRoutine.class);
                    intent.putExtra("row", rowpos);
                    intent.putExtra("col", (int) v.getTag());
                    getContext().sendBroadcast(intent);


                    Toast.makeText(getContext(), "last clicked" , Toast.LENGTH_SHORT).show();
                    getView((int)v.getTag(), (View)v.getParent(), (ViewGroup)v.getParent().getParent());

                    //FragRoutine fr = new FragRoutine();
                    //fr.TotalList.get(rowpos).set(getCount() - 1, temp_base_part);
                    //fr.TotalList.get(rowpos).add(temp_part);

                }
                return true;
            }
        });
    }

    return retval;
}

[广播听众]

...


public class FragRoutine extends Fragment
{
    private BroadcastReceiver mReceiver;

    @Override
    public View onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate (R.layout.schedule_routine, container,false);
        return view;
    }

    public void onStart() {
        super.onStart();        
        initializeViewObject();
    }

    private void initializeViewObject(){

            IntentFilter intentFilter = new IntentFilter();
        mReceiver = new BroadcastReceiver(){

            @Override
            public void onReceive(Context context, Intent intent) {
                // TODO Auto-generated method stub
                Toast.makeText(context, "listen!", Toast.LENGTH_LONG).show();
                String msg_me = intent.getStringExtra("row");
            }

        };

        getActivity().registerReceiver(mReceiver, intentFilter);

...

【问题讨论】:

    标签: android android-intent broadcastreceiver fragment


    【解决方案1】:

    您使用空的IntentFilter 注册了您的BroadcastReceiver。它不知道要听什么,所以它永远不会被调用。

    您像这样创建了广播Intent

        Intent intent = new Intent();
        //intent.setClass(getContext(), FragRoutine.class);
        intent.putExtra("row", rowpos);
        intent.putExtra("col", (int) v.getTag());
        getContext().sendBroadcast(intent);
    

    这个Intent 也没有操作,没有组件,也没有数据。当你广播这个Intent 时,Android 不知道如何处理它。

    尝试向Intent 和`IntentFilter 添加一个唯一的ACTION。像这样的:

        Intent intent = new Intent("my.special.broadcast.action");
        //intent.setClass(getContext(), FragRoutine.class);
        intent.putExtra("row", rowpos);
        intent.putExtra("col", (int) v.getTag());
        getContext().sendBroadcast(intent);
    

    现在注册您的听众以收听此Intent ACTION:

        IntentFilter intentFilter =
                new IntentFilter("my.special.broadcast.action");
        mReceiver = new BroadcastReceiver(){
           ...
        };
        getActivity().registerReceiver(mReceiver, intentFilter);
    

    【讨论】:

    • 谢谢!!效果很好!!可能是我应该更多地研究意图。我尝试了很多方法,但没有任何效果.. :(
    猜你喜欢
    • 2013-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-06
    • 1970-01-01
    • 2013-01-14
    • 1970-01-01
    相关资源
    最近更新 更多