从微调器传递变量。使空微调器被识别为字符串中的第一个值

Passing variables from a spinner. Make empty spinner get recognized as the first value in the string

当用户输入 Activity 时,将有 4 个旋转框需要填写,然后单击提交按钮。

出现一个进度对话框,然后用户将被重定向回之前的 activity。

如果用户没有填写所有必要的数据,应用程序将获得 NPE。

是否可以声明,如果用户没有 select 微调器中的任何内容,微调器将选择字符串中的第一个变量,这将是要传递给下一个 activity?

我所有的微调器都将“NIL”作为第一个值,它是“Nothing in line”的缩写

因此,如果微调器为空 = NIL

感谢您的宝贵时间!

代码

submit.setOnClickListener(v -> {
        progressBar = new ProgressDialog(v.getContext());
        progressBar.setCancelable(false);
        progressBar.setTitle("Sending Data ...");
        progressBar.setMessage("Redirecting to previous page");
        progressBar.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        progressBar.setProgress(0);
        progressBar.setMax(100);
        progressBar.show();
        progressBarStatus = 0;
        fileSize = 0;

        progressBar.setOnDismissListener(new DialogInterface.OnDismissListener() {
            @Override
            public void onDismiss(DialogInterface dialog) {
                openwhatsActivity();
            }

        });

        new Thread(() -> {
            while (progressBarStatus <100) {
                progressBarStatus = doOperation();
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                progressBarHandler.post(() -> progressBar.setProgress(progressBarStatus));
            }

            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            progressBar.dismiss();


        }).start();


    });

}
public int doOperation() {

    while (fileSize <= 10000) {
        fileSize++;
        if (fileSize == 1000) {
            return 10;
        }else if (fileSize == 2000) {
            return 20;
        }

    }
    return 100;

}


public void openwhatsActivity() {

    String roadtext = roadwheelsspinner.getSelectedItem().toString();
    String separationtext = separationspinner.getSelectedItem().toString();
    String sprockettext = sprocketwheelspinner.getSelectedItem().toString();
    String returntext = returnrollersspinner.getSelectedItem().toString();


    Intent intent = new Intent(this, whatsActivity.class);
    intent.putExtra(EXTRA_ROADTEXT, roadtext);
    intent.putExtra(EXTRA_SEPARATIONTEXT, separationtext);
    intent.putExtra(EXTRA_SPROCKETTEXT, sprockettext);
    intent.putExtra(EXTRA_RETURNTEXT, returntext);
    startActivity(intent);

}

}

编辑

我可能遗漏了一些可以使我的问题更清楚的细节...

微调器的外观如下:

在用户与之交互之前,微调器中有一种提示。

当用户与之交互时,第一个可能的选择将是“NIL”。

如果用户没有关于该主题的任何声明,他将选择“NIL”。

但如果用户不与之交互,则默认值应为“NIL”。

包含微调器的代码:

    Spinner roadwheelsspinner = findViewById(R.id.roadwheelsspinner);
    ArrayAdapter<CharSequence> roadadapter = ArrayAdapter.createFromResource(this, R.array.roadnumbers, android.R.layout.simple_spinner_item);
    roadadapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    roadwheelsspinner.setAdapter(new NothingSelectedSpinnerAdapter(roadadapter, R.layout.contact_spinner_row_nothing_selected_road, this));

    Spinner separationspinner = findViewById(R.id.separationspinner);
    ArrayAdapter<CharSequence> separationadapter = ArrayAdapter.createFromResource(this, R.array.separationnumbers, android.R.layout.simple_spinner_item);
    separationadapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    separationspinner.setAdapter(new NothingSelectedSpinnerAdapter(separationadapter, R.layout.contact_spinner_row_nothing_selected_separation, this));

    Spinner sprocketwheelspinner = findViewById(R.id.sprocketwheelspinner);
    ArrayAdapter<CharSequence> sprocketadapter = ArrayAdapter.createFromResource(this, R.array.sprocketwheelnumbers, android.R.layout.simple_spinner_item);
    sprocketadapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    sprocketwheelspinner.setAdapter(new NothingSelectedSpinnerAdapter(sprocketadapter, R.layout.contact_spinner_row_nothing_selected_sprocket, this));

    Spinner returnrollersspinner = findViewById(R.id.returnrollersspinner);
    ArrayAdapter<CharSequence> returnadapter = ArrayAdapter.createFromResource(this, R.array.returnrollersnumbers, android.R.layout.simple_spinner_item);
    returnadapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    returnrollersspinner.setAdapter(new NothingSelectedSpinnerAdapter(returnadapter, R.layout.contact_spinner_row_nothing_selected_return, this));

    Spinner axlesspinner = findViewById(R.id.axlesspinner);
    ArrayAdapter<CharSequence> axlesadapter = ArrayAdapter.createFromResource(this, R.array.axlesnumbers, android.R.layout.simple_spinner_item);
    axlesadapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    axlesspinner.setAdapter(new NothingSelectedSpinnerAdapter(axlesadapter, R.layout.contact_spinner_row_nothing_selected_axles, this));


    submit.setOnClickListener(v -> {
        progressBar = new ProgressDialog(v.getContext());
        progressBar.setCancelable(false);
        progressBar.setTitle("Sending Data ...");
        progressBar.setMessage("Redirecting to previous page");
        progressBar.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        progressBar.setProgress(0);
        progressBar.setMax(100);
        progressBar.show();
        progressBarStatus = 0;
        fileSize = 0;

        progressBar.setOnDismissListener(new DialogInterface.OnDismissListener() {
            @Override
            public void onDismiss(DialogInterface dialog) {
                openwhatsActivity();
            }

        });

        new Thread(() -> {
            while (progressBarStatus <100) {
                progressBarStatus = doOperation();
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                progressBarHandler.post(() -> progressBar.setProgress(progressBarStatus));
            }

            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            progressBar.dismiss();


        }).start();


    });

}
public int doOperation() {

    while (fileSize <= 10000) {
        fileSize++;
        if (fileSize == 1000) {
            return 10;
        }else if (fileSize == 2000) {
            return 20;
        }

    }
    return 100;

}


public void openwhatsActivity() {

    String roadtext = roadwheelsspinner.getSelectedItem().toString();
    String separationtext = separationspinner.getSelectedItem().toString();
    String sprockettext = sprocketwheelspinner.getSelectedItem().toString();
    String returntext = returnrollersspinner.getSelectedItem().toString();


    Intent intent = new Intent(this, whatsActivity.class);
    intent.putExtra(EXTRA_ROADTEXT, roadtext);
    intent.putExtra(EXTRA_SEPARATIONTEXT, separationtext);
    intent.putExtra(EXTRA_SPROCKETTEXT, sprockettext);
    intent.putExtra(EXTRA_RETURNTEXT, returntext);
    startActivity(intent);

}

}

对不起我的错误spelling/grammar..英语不是我的母语。

编辑编辑

我解决了我的问题。

我使用的适配器是几年前由一位用户在此页面上发布的,它提供了一个很好的解决方案,可以解决如何在无 selected 显示中获得视图。

Link 这里:

SpinnerAdapter 代码:

public class NothingSelectedSpinnerAdapter implements SpinnerAdapter, ListAdapter {

protected static final int EXTRA = 1;
protected SpinnerAdapter adapter;
protected Context context;
protected int nothingSelectedLayout;
protected int nothingSelectedDropdownLayout;
protected LayoutInflater layoutInflater;


public NothingSelectedSpinnerAdapter(
        SpinnerAdapter spinnerAdapter,
        int nothingSelectedLayout, Context context) {

    this(spinnerAdapter, nothingSelectedLayout, -1, context);
}


public NothingSelectedSpinnerAdapter(SpinnerAdapter spinnerAdapter,
                                     int nothingSelectedLayout, int nothingSelectedDropdownLayout, Context context) {
    this.adapter = spinnerAdapter;
    this.context = context;
    this.nothingSelectedLayout = nothingSelectedLayout;
    this.nothingSelectedDropdownLayout = nothingSelectedDropdownLayout;
    layoutInflater = LayoutInflater.from(context);
}

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

    if (position == 0) {
        return getNothingSelectedView(parent);
    }
    return adapter.getView(position - EXTRA, null, parent);


}


protected View getNothingSelectedView(ViewGroup parent) {
    return layoutInflater.inflate(nothingSelectedLayout, parent, false);
}

@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {

    if (position == 0) {
        return nothingSelectedDropdownLayout == -1 ?
                new View(context) :
                getNothingSelectedDropdownView(parent);
    }


    return adapter.getDropDownView(position - EXTRA, null, parent);
}

protected View getNothingSelectedDropdownView(ViewGroup parent) {
    return layoutInflater.inflate(nothingSelectedDropdownLayout, parent, false);
}

@Override
public int getCount() {
    int count = adapter.getCount();
    return count == 0 ? 0 : count + EXTRA;
}

@Override
public Object getItem(int position) {
    return position == 0 ? 0 : adapter.getItem(position - EXTRA);
}

@Override
public int getItemViewType(int position) {
    return 0;
}

@Override
public int getViewTypeCount() {
    return 1;
}

@Override
public long getItemId(int position) {
    return position >= EXTRA ? adapter.getItemId(position - EXTRA) : position - EXTRA;
}

@Override
public boolean hasStableIds() {
    return adapter.hasStableIds();
}

@Override
public boolean isEmpty() {
    return adapter.isEmpty();
}

@Override
public void registerDataSetObserver(DataSetObserver observer) {
    adapter.registerDataSetObserver(observer);
}

@Override
public void unregisterDataSetObserver(DataSetObserver observer) {
    adapter.unregisterDataSetObserver(observer);
}

@Override
public boolean areAllItemsEnabled() {
    return false;
}

@Override
public boolean isEnabled(int position) {
    return position != 0;
}

}

我所做的是:我将 return 位置从 0 改为“NIL”。 现在,当微调器中没有声明任何内容时,它会将值“NIL”传递给下一个 Activity.

All of my spinners have "NIL" as the first value

填充每个微调器后只需使用 spinner.setSelection(1)。使用该值作为“默认值”,这样您就不必检查用户是否选择了某些东西,微调器将始终选择一些东西。

你可以这样做,

public class MainActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener {

private Spinner spinner;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    spinner = findViewById(R.id.spinner);

    String[] array = {"Hi", "Hello", "Jetpack", "Compose"};

    // set the adapter on spinner
    spinner.setAdapter(new ArrayAdapter(this, android.R.layout.simple_list_item_1, array));

    // set the item selected listener
    spinner.setOnItemSelectedListener(this);
    
    // You can get the value from spinner
    String selectedOption = array[spinner.getSelectedItemPosition()];
}

@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int position, long l) {
    spinner.setSelection(position);
}

@Override
public void onNothingSelected(AdapterView<?> adapterView) {
    spinner.setSelection(0);
}
}