Android: как сделать, чтобы элементы из списка открывались в diff.деятельность / Намерение - PullRequest
2 голосов
/ 13 мая 2011

Я создал список и хотел бы знать, как сделать каждый diff. пункт открыть разн. деятельность / Намерение пример: в списке -start trip (он сразу же получит данные о местоположении GPS, отправит их на сервер и подтвердит их отправку)

-Включить (он захватит данные времени / даты и сразу отправит их на сервер и подтвердит их отправку)

-Customer Svc (предназначено для сканера штрих-кода и возвращает результат без отображения и отправляет данные результата на сервер

сразу) -Независимая проверка (намерение сканера штрих-кода и возврата результата не отображается и отправить данные результата в

сервер сразу) -Выбрать (намерение сканера штрих-кода и вернуть результат без отображения и отправить данные результатов на сервер право

км)

-Выйти из системы (запросит пароль для выхода из системы)

Я использую проект 2.2 с SDK 3, буду использовать устройство прошивки 1.5 Motorola i1. Я импортировал штрих-код ZXING

Сканер "Android Интеграция" в проект, который должен открыть приложение сканера штрих-кода отдельно. Я использую затмение. Последнее, что я получаю сообщение об ошибке в resultTxt и хотел бы знать, как решить эту проблему?

Спасибо Меррилл

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent">
    <TextView android:id="@+id/selection" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content"/>
    <ListView android:id="@android:id/list" 
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent" 
        android:drawSelectorOnTop="false"/>
</LinearLayout>    

Customer.java

import android.app.ListActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;

public class Customer extends ListActivity
{
    TextView selection;
    String[] items = { "Start Trip", "Clock in", "Customer Svc", 
            "Independent Inspection", "Pick Up", "Log Out" };

    @Override
    public void onCreate(Bundle icicle)
    {
        super.onCreate(icicle);
        setContentView(R.layout.main);
        setListAdapter(new ArrayAdapter<String>(
                this, android.R.layout.simple_list_item_1, items));
        selection = (TextView) findViewById(R.id.selection);
    }

    public void onListItemClick(ListView parent, View v, int position, long id)
    {
        Intent intent = new Intent("com.company.merrill.IntentIntegrator");
        intent.setPackage("com.company.merrill");
        intent.putExtra("SCAN_MODE", "QR_CODE_MODE");
        startActivityForResult(intent, 0);
    }

    public void onActivityResult(int requestCode, int resultCode, Intent intent)
    {
        if (requestCode == 0)
        {
            if (resultCode == RESULT_OK)
            {
                // contents contains whatever the code was
                String contents = intent.getStringExtra("SCAN_RESULT");

                // Format contains the type of code i.e. UPC, EAN, QRCode etc...
                String format = intent.getStringExtra("SCAN_RESULT_FORMAT");

                // Handle successful scan. In this example 
                // I just put the results into the TextView
                resultsTxt.setText(format + "\n" + contents);
            }
            else if (resultCode == RESULT_CANCELED)
            {
                // Handle cancel. If the user presses 'back' 
                // before a code is scanned.
                resultsTxt.setText("Canceled");
            }
        }
    }
}

1 Ответ

4 голосов
/ 14 мая 2011

Вы можете начать различные действия в зависимости от позиции в ListView элемента, который вы только что щелкнули:

private static final int ACTIVITY_0 = 0;
private static final int ACTIVITY_1 = 1;
private static final int ACTIVITY_2 = 2;

@Override
protected void onListItemClick(ListView l, View v, int position, long id)
{
    super.onListItemClick(l, v, position, id);
    final Intent intent = new Intent();
    // Set up different intents based on the item clicked: 
    switch (position)
    {
        case ACTIVITY_0:
            intent.setClass(this, com.company.merrill.IntentIntegrator.class);
            break;
        case ACTIVITY_1:
            intent.setClass(this, com.company.merrill.SecondActivity.class);
            break;
        case ACTIVITY_2:
            intent.setClass(this, com.company.merrill.ThirdActivity.class);
            break;
        default:
            break;
    }
    // Pass the item position as the requestCode parameter, so on the `Activity`'s
    // return you can examine it, and determine which activity were you in prior. 
    startActivityForResult(intent, position);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent)
{
    super.onActivityResult(requestCode, resultCode, intent);
    if (resultCode == RESULT_OK)
    {
        // Perform different actions based on from which activity is
        // the application returning:
        switch (requestCode)
        {
            case ACTIVITY_0:
                // contents contains whatever the code was
                String contents = intent.getStringExtra("SCAN_RESULT");

                // Format contains the type of code i.e. UPC, EAN, QRCode etc...
                String format = intent.getStringExtra("SCAN_RESULT_FORMAT");

                // Handle successful scan. In this example 
                // I just put the results into the TextView
                resultsTxt.setText(format + "\n" + contents);
                break;
            case ACTIVITY_1:
                // TODO: handle the return of the SecondActivity
                break;
            case ACTIVITY_2:
                // TODO: handle the return of the ThirdActivity
                break;
            default:
                break;
        }
    }
    else if (resultCode == RESULT_CANCELED)
    {
        // Handle cancel. If the user presses 'back' 
        // before a code is scanned.
        resultsTxt.setText("Canceled");
    }
}

Обновление
Для более элегантного результата вы можете создать собственный тип данных элемента списка:
CustomerListItem.java

public class CustomerListItem
{
    private String label;
    private Class<?> activity;

    /**
     * @param label
     * @param activity
     */
    public CustomerListItem(String label, Class<?> activity)
    {
        super();
        this.label = label;
        this.activity = activity;
    }

    /**
     * @return the label
     */
    public String getLabel()
    {
        return label;
    }

    /**
     * @param label the label to set
     */
    public void setLabel(String label)
    {
        this.label = label;
    }

    /**
     * @return the activity
     */
    public Class<?> getActivity()
    {
        return activity;
    }

    /**
     * @param activity the activity to set
     */
    public void setActivity(Class<Activity> activity)
    {
        this.activity = activity;
    }

    /* (non-Javadoc)
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString()
    {
        return this.label;
    }
}

Используя этот класс, вы можете привязать Activity к элементу списка, поэтому при щелчке по нему вы будете знать, какой Activity запустить.

Ваш Customer.java класс будет выглядеть так:

public class Customer extends ListActivity
{
    TextView selection;
    CustomerListItem[] items = { 
            new CustomerListItem("Start Trip", StartTripActivity.class), 
            new CustomerListItem("Clock in", ClockinActivity.class), 
            new CustomerListItem("Customer Svc", CustomerSvcActivity.class), 
            new CustomerListItem("Independent Inspection", IInspectionActivity.class), 
            new CustomerListItem("Pick Up", PickUpActivity.class), 
            new CustomerListItem("Log Out", LogoutActivity.class)};

    @Override
    public void onCreate(Bundle icicle)
    {
        super.onCreate(icicle);
        setContentView(R.layout.main);
        setListAdapter(new ArrayAdapter<CustomerListItem>(
                this, android.R.layout.simple_list_item_1, items));
        selection = (TextView) findViewById(R.id.selection);
    }

    @Override
    protected void onListItemClick(ListView l, View v, int position, long id)
    {
        super.onListItemClick(l, v, position, id);
        final Intent intent = new Intent(this, items[position].getActivity());
        startActivityForResult(intent, position);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent intent)
    {
        super.onActivityResult(requestCode, resultCode, intent);
        if (resultCode == RESULT_OK)
        {
            // Perform different actions based on from which activity is
            // the application returning:
            switch (requestCode)
            {
                case 0:
                    // TODO: handle the return of the StartTripActivity
                    break;
                case 1:
                    // TODO: handle the return of the ClockinActivity
                    break;
                case 2:
                    // TODO: handle the return of the CustomerSvcActivity
                    // and so on...
                    break;
                default:
                    break;
            }
        }
        else if (resultCode == RESULT_CANCELED)
        {
            resultsTxt.setText("Canceled");
        }
    }
}
...