首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >安卓拖放,API<11

安卓拖放,API<11
EN

Stack Overflow用户
提问于 2014-05-08 04:58:07
回答 1查看 164关注 0票数 0

我是android的新手(到现在已经3周了),我有一个问题(当然)。我搜索了很多,发现关于这个问题的主题很少,但没有得到正确的答案。

我不能在api<11中使用裁剪数据,所以我从代码中完全删除了这一部分。并将view.startDrag中的剪辑数据替换为null。对于API >=11来说一切正常,但是API级别低于11的时候,我得到了一个错误。

我不知道为什么(可能的dragEvent?)因为我没有得到任何消息,我的代码中有任何方法与API level 2.2或其他东西不兼容。我的代码是:

代码语言:javascript
复制
public class GlavnaAktivnost extends Activity {
String linije[] = { "141 - SAMOBOR - Rakov Potok - JAGNJIĆ DOL",
        "142 - SAMOBOR - Klake - TERIHAJI",
        "143 - SAMOBOR - Rude - BRASLOVJE",
        "144 - SAMOBOR - Smerovišće - LIPOVEC",
        "145 - SAMOBOR - SLANI DOL",
        "146 - SAMOBOR - Otruševac - VRHOVČAK", "147 - SAMOBOR - BREGANA",
        "148 - SAMOBOR - OTOK", "149 - SAMOBOR - MEDSAVE",
        "150 - SAMOBOR - Grdanjci - Kršlin - GORNJA VAS",
        "150A - SAMOBOR - Grdanjci - NORŠIĆ SELO",
        "151 - SAMOBOR - Sv. Nedelja - ZAGREB (ČRNOMEREC)",
        "153 - SAMOBOR - Sv. Nedelja - ZAGREB (LJUBLJANICA)",
        "155 - SAMOBOR - Sv. Nedelja - ZAGREB (AUTOBUSNI KOLODVOR)",
        "157 - SAMOBOR - Sv. Martin - GALGOVO",
        "158 - SAMOBOR - Cerje - BUKOVJE",
        "159 - ZAGREB (SAVSKI MOST) - Galgovo - DREŽNIK / SV. MARTIN",
        "160 - MALA GORICA - Kerestinec - ZAGREB (A. K.)",
        "162 - SAMOBOR - Sv. Nedjelja - Novaki - Rakitje - ČRNOMEREC",
        "260 - LULIĆ - Jastrebarsko - ZAGREB (SAVSKI MOST)",
        "260A - JASTREBARSKO - Krašić - PRIBIĆ",
        "261 - KLINČA SELA - Repišće - NOVO SELO",
        "262 - PISAROVINA - KLINČA SELO",
        "263 - ZAGREB (SAVSKI MOST) - Kupinečki Kraljevac - DONJA KUPČINA",
        "264 - JASTREBARSKO - Klinča Selo - ZAGREB (A. K.)",
        "265 - PISAROVINA - LIJEVO SREDIČKO",
        "266 - PISAROVINA - Lučelnica - Vukomerić - DUBRANEC",
        "267 - KLINČA SELA - BETER", "KALJE - KOSTANJEVAC - KALJE",
        "SOŠICE - JASTREBARSKO - SOŠICE",
        "SVETA JANJA - JASTREBARSKO - SLAVETIĆ - SVETA JANA" };
String favoriti[] = { "Dodaj favorit +", "", "" };
MyDragEventListener myDragEventListener = new MyDragEventListener();
ListView list1, list2;
int i = 0;
int pozicija;
ArrayAdapter<String> adapter1, adapter2;
@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.pozadina);
    inicijalizacijaIinterface();

    list2.setOnItemLongClickListener(new OnItemLongClickListener() {
        @Override
        public boolean onItemLongClick(AdapterView<?> parent, View view,
                int position, long id) {
            // TODO Auto-generated method stub
            MyDragShadowBuilder myShadow = new MyDragShadowBuilder(view);
            try{view.startDrag(null, // ClipData
                    myShadow, // View.DragShadowBuilder
                    linije[position], 0);// Object myLocalState
            }
            catch(Exception e){e.printStackTrace();}


            pozicija = adapter2.getPosition(linije[position].toString());

            return true;
        }
    });
    list1.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
            // TODO Auto-generated method stub
            if (position == 0) {
                Intent intent = new Intent(
                        "samobor.samoborcek.RasporedVoznje");
                intent.putExtra("LIN", 143);
                startActivity(intent);
            }
        }
    });
}

private void inicijalizacijaIinterface() {
    // TODO Auto-generated method stub
    list1 = (ListView) findViewById(R.id.list1);
    list2 = (ListView) findViewById(R.id.list2);
    adapter1 = new ArrayAdapter<String>(GlavnaAktivnost.this,
            R.layout.listview, favoriti);

    adapter2 = new ArrayAdapter<String>(GlavnaAktivnost.this,
            R.layout.listview, linije);
    list2.setAdapter(adapter2);

    list1.setAdapter(adapter1);
    list1.setOnDragListener(myDragEventListener);
    list2.setOnDragListener(myDragEventListener);
    list1.setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            // TODO Auto-generated method stub
            if (MotionEvent.ACTION_MOVE == event.getAction())
                return true;
            return false;
        }
    });

}

public void paraf() {
    // TODO Auto-generated method stub

    if (i == 1) {
        LinearLayout.LayoutParams params3 = new LinearLayout.LayoutParams(
                android.view.ViewGroup.LayoutParams.MATCH_PARENT,
                android.view.ViewGroup.LayoutParams.MATCH_PARENT, 82);
        params3.bottomMargin = 20;// Jedna linija
        list1.setLayoutParams(params3);
        LinearLayout.LayoutParams params4 = new LinearLayout.LayoutParams(
                android.view.ViewGroup.LayoutParams.MATCH_PARENT,
                android.view.ViewGroup.LayoutParams.MATCH_PARENT, 18);
        list2.setLayoutParams(params4);
    }
    if (i == 2) {
        LinearLayout.LayoutParams params3 = new LinearLayout.LayoutParams(
                android.view.ViewGroup.LayoutParams.MATCH_PARENT,
                android.view.ViewGroup.LayoutParams.MATCH_PARENT, 66);
        params3.bottomMargin = 20;// Dvije linije
        list1.setLayoutParams(params3);
        LinearLayout.LayoutParams params4 = new LinearLayout.LayoutParams(
                android.view.ViewGroup.LayoutParams.MATCH_PARENT,
                android.view.ViewGroup.LayoutParams.MATCH_PARENT, 34);
        list2.setLayoutParams(params4);
    }
    if (i == 3) {
        LinearLayout.LayoutParams params5 = new LinearLayout.LayoutParams(
                android.view.ViewGroup.LayoutParams.MATCH_PARENT,
                android.view.ViewGroup.LayoutParams.MATCH_PARENT, 49);
        params5.bottomMargin = 20;// 3 linije
        list1.setLayoutParams(params5);
        LinearLayout.LayoutParams params6 = new LinearLayout.LayoutParams(
                android.view.ViewGroup.LayoutParams.MATCH_PARENT,
                android.view.ViewGroup.LayoutParams.MATCH_PARENT, 51);
        list2.setLayoutParams(params6);
    }

}

private static class MyDragShadowBuilder extends View.DragShadowBuilder {
    private static Drawable shadow;

    public MyDragShadowBuilder(View v) {
        super(v);
        shadow = new ColorDrawable(Color.argb(140, 102, 255, 255));
    }

    @Override
    public void onProvideShadowMetrics(Point size, Point touch) {
        int width = getView().getWidth();
        int height = getView().getHeight();

        shadow.setBounds(0, 0, width, height);
        size.set(width, height);
        touch.set(width / 2, height / 2);
    }

    @Override
    public void onDrawShadow(Canvas canvas) {
        shadow.draw(canvas);
    }

}

private class MyDragEventListener implements View.OnDragListener {
    @Override
    public boolean onDrag(View v, DragEvent event) {
        final int action = event.getAction();

        switch (action) {
        case DragEvent.ACTION_DRAG_ENTERED:
            if (v == list1) {
                i++;
                paraf();
            }
            break;
        case DragEvent.ACTION_DRAG_EXITED:
            if (v == list1) {
                i--;
                paraf();
            }
            break;
        case DragEvent.ACTION_DROP:
            // Gets the item containing the dragged data

            // If apply only if drop on buttonTarget
            if (v == list1 && i <= 3) {

                favoriti[i - 1] = linije[pozicija].toString();

                adapter1.notifyDataSetChanged();

                while (pozicija + 1 < linije.length) {
                    linije[pozicija] = linije[pozicija + 1].toString();
                    if (pozicija + 1 == linije.length) {
                        linije[pozicija] = " ";
                    }
                    pozicija++;

                }

                adapter2.notifyDataSetChanged();
            }
            if (v != list1 || i > 3)
                Toast.makeText(getApplicationContext(), "Nedozvoljeno!",
                        Toast.LENGTH_SHORT).show();

            break;
        }
        return true;
    }
}

问:哪里出了问题?或者你能告诉我,如果API水平高于11,如何做某事,如果不是,做另一件事?因为MyDragEventListener是在任何方法之外构造的,如果我在示例onCreat中构造它,它将不是全局的,因此在任何其他方法中都不可见。

我现在解决了这个问题,我创建了另外两个活动,第一个活动是主screen...And,如果api级别是示例2.2,启动这个活动(在这个活动中,我使用如果list2上的项目被长时间单击发送数据到list1(没有拖放)),如果它是4.3启动其他活动(拖放)。

附言:我知道这段代码很烂,但我不知道为什么我就是不看paraf()方法,我稍后会修正它:)谢谢你,Matija

EN

回答 1

Stack Overflow用户

发布于 2014-05-08 06:49:00

View.OnDragListener was introduced with API level 11。尝试创建MyDragEventListener类(从它派生)的实例将在预蜂窝设备上崩溃。

您可以检查API级别并相应地处理android.os.Build.VERSION.SDK_INT字段,例如

代码语言:javascript
复制
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB)
{
    MyDragEventListener myDragEventListener = new MyDragEventListener();
    ...
}

与View.DragShadowBuilder相同,&c。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23528300

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档