java - 将微调项目存储在字符串值中

标签 java android xml android-layout android-studio

我创建了一个连接到远程数据库的应用程序。数据库中的项目通过我的 MainActivity 类中的微调器显示。我想在单独的类(Map.java)和XML页面(map.xml)中显示所选项目,因此我在Map.java中使用此代码来尝试获取所选项目并显示它:

    Spinner mySpinner = (Spinner)findViewById(R.id.spinFood);
    String text = mySpinner.getSelectedItem().toString();
    EditText e = (EditText) findViewById (R.id.editText1);
    e.setText(text);

为了显示此值,我在 map.xml 文件中创建了一个 EditText:

<EditText
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:inputType="text"
    android:text="@string/text"
    android:id="@+id/editText1"
    android:layout_alignBottom="@+id/textView"
    android:layout_toRightOf="@+id/textView"
    android:layout_alignRight="@+id/imageView"
    android:layout_alignEnd="@+id/imageView" />

android:input_type="text"是我创建的字符串值:

<string name="text"> %s </string>

但是每当我打开 map 页面时,我的应用程序就会崩溃。有人可以告诉我哪里出了问题吗? 这是我的 MainActivity 和 Map.java 的所有代码

主要 Activity

package com.example.cillin.infoandroidhivespinnermysql;

import java.util.ArrayList;
..

public class MainActivity extends Activity implements OnItemSelectedListener        {

private Button btnAddNewCategory;
private TextView txtCategory;
public Spinner spinnerFood;

// array list for spinner adapter
private ArrayList<Category> categoriesList;
ProgressDialog pDialog;

// API urls
// Url to create new category
private String URL_NEW_CATEGORY = "http://192.168.1.4/food_api/new_category.php";
// Url to get all categories
private String URL_CATEGORIES = "http://192.168.1.4/food_api/get_categories.php";

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

    btnAddNewCategory = (Button) findViewById(R.id.btnAddNewCategory);
    spinnerFood = (Spinner) findViewById(R.id.spinFood);
    txtCategory = (TextView) findViewById(R.id.txtCategory);

    categoriesList = new ArrayList<Category>();

    // spinner item select listener
    spinnerFood.setOnItemSelectedListener(this);

    // Add new category click event
    btnAddNewCategory.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            if (txtCategory.getText().toString().trim().length() > 0) {

                // new category name
                String newCategory = txtCategory.getText().toString();

                // Call Async task to create new category
                new AddNewCategory().execute(newCategory);
            } else {
                Toast.makeText(getApplicationContext(),
                        "Please enter category name", Toast.LENGTH_SHORT)
                        .show();
            }
        }
    });

    new GetCategories().execute();

}

/**
 * Adding spinner data
 * */
private void populateSpinner() {
    List<String> lables = new ArrayList<String>();

    txtCategory.setText("");

    for (int i = 0; i < categoriesList.size(); i++) {
        lables.add(categoriesList.get(i).getName());
    }

    // Creating adapter for spinner
    ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_spinner_item, lables);

    // Drop down layout style - list view with radio button
    spinnerAdapter
            .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

    // attaching data adapter to spinner
    spinnerFood.setAdapter(spinnerAdapter);

    //spinnerValue = spinnerFood.getSelectedItem().toString();
}

/**
 * Async task to get all food categories
 * */
private class GetCategories extends AsyncTask<Void, Void, Void> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pDialog = new ProgressDialog(MainActivity.this);
        pDialog.setMessage("Fetching food categories..");
        pDialog.setCancelable(false);
        pDialog.show();

    }

    @Override
    protected Void doInBackground(Void... arg0) {
        ServiceHandler jsonParser = new ServiceHandler();
        String json = jsonParser.makeServiceCall(URL_CATEGORIES, ServiceHandler.GET);

        Log.e("Response: ", "> " + json);

        if (json != null) {
            try {
                JSONObject jsonObj = new JSONObject(json);
                if (jsonObj != null) {
                    JSONArray categories = jsonObj
                            .getJSONArray("categories");

                    for (int i = 0; i < categories.length(); i++) {
                        JSONObject catObj = (JSONObject) categories.get(i);
                        Category cat = new Category(catObj.getInt("id"),
                                catObj.getString("name"));
                        categoriesList.add(cat);
                    }
                }

            } catch (JSONException e) {
                e.printStackTrace();
            }

        } else {
            Log.e("JSON Data", "Didn't receive any data from server!");
        }

        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);
        if (pDialog.isShowing())
            pDialog.dismiss();
        populateSpinner();
    }

}

/**
 * Async task to create a new food category
 * */
private class AddNewCategory extends AsyncTask<String, Void, Void> {

    boolean isNewCategoryCreated = false;

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pDialog = new ProgressDialog(MainActivity.this);
        pDialog.setMessage("Creating new category..");
        pDialog.setCancelable(false);
        pDialog.show();

    }

    @Override
    protected Void doInBackground(String... arg) {

        String newCategory = arg[0];

        // Preparing post params
        List<NameValuePair> params = new ArrayList<NameValuePair>();
        params.add(new BasicNameValuePair("name", newCategory));

        ServiceHandler serviceClient = new ServiceHandler();

        String json = serviceClient.makeServiceCall(URL_NEW_CATEGORY,
                ServiceHandler.POST, params);

        Log.d("Create Response: ", "> " + json);

        if (json != null) {
            try {
                JSONObject jsonObj = new JSONObject(json);
                boolean error = jsonObj.getBoolean("error");
                // checking for error node in json
                if (!error) {
                    // new category created successfully
                    isNewCategoryCreated = true;
                } else {
                    Log.e("Create Category Error: ", "> " + jsonObj.getString("message"));
                }

            } catch (JSONException e) {
                e.printStackTrace();
            }

        } else {
            Log.e("JSON Data", "Didn't receive any data from server!");
        }

        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);
        if (pDialog.isShowing())
            pDialog.dismiss();
        if (isNewCategoryCreated) {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    // fetching all categories
                    new GetCategories().execute();
                }
            });
        }
    }

}

@Override
public void onItemSelected(AdapterView<?> parent, View view, int position,
                           long id) {
    Toast.makeText(
            getApplicationContext(),
            parent.getItemAtPosition(position).toString() + " Selected" ,
            Toast.LENGTH_LONG).show();

}

@Override
public void onNothingSelected(AdapterView<?> arg0) {
}

}

map .java

package com.example.cillin.infoandroidhivespinnermysql;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Spinner;
import android.widget.TextView;

公共(public)类Map扩展了Activity {

public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);


    //This page layout is located in the menu XML file
    //SetContentView links a Java file, to its XML file for the layout
    setContentView(R.layout.map);

    /*TextView.setText(spinnerValue);
    TextView spinv = (TextView)findViewById(R.id.textView2);
    spinv.setText(getspin());
    spinv = getspin();*/

    Spinner mySpinner = (Spinner)findViewById(R.id.spinFood);
    String text = mySpinner.getSelectedItem().toString();
    EditText e = (EditText) findViewById (R.id.editText1);
    e.setText(text);


    Button mainm = (Button)findViewById(R.id.mainmenu);
    mainm.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //This button is linked to the map page
            Intent i = new Intent(Map.this, MainMenu.class);

            //Activating the intent
            startActivity(i);
        }
    });
}

}

任何帮助将不胜感激!!

以下是我的 logcat 崩溃时出现的错误:

  E/DatabaseUtils﹕ Writing exception to parcel
    java.lang.SecurityException: Permission Denial: get/set setting for user asks to run as user -2 but is calling from user 0; this requires android.permission.INTERACT_ACROSS_USERS_FULL
            at com.android.server.am.ActivityManagerService.handleIncomingUser(ActivityManagerService.java:14643)
            at android.app.ActivityManager.handleIncomingUser(ActivityManager.java:2469)
            at com.android.providers.settings.SettingsProvider.call(SettingsProvider.java:688)
            at android.content.ContentProvider$Transport.call(ContentProvider.java:325)
            at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:275)
            at android.os.Binder.execTransact(Binder.java:404)


    E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.example.cillin.infoandroidhivespinnermysql, PID: 14691
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.cillin.infoandroidhivespinnermysql/com.example.cillin.infoandroidhivespinnermysql.Map}: java.lang.NullPointerException
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2305)
            at      

android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2363)
            at android.app.ActivityThread.access$900(ActivityThread.java:161)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1265)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:157)
        at android.app.ActivityThread.main(ActivityThread.java:5356)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
        at dalvik.system.NativeStart.main(Native Method)
 Caused by: java.lang.NullPointerException
        at com.example.cillin.infoandroidhivespinnermysql.Map.onCreate(Map.java:34)
        at android.app.Activity.performCreate(Activity.java:5426)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2269)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2363)
            at android.app.ActivityThread.access$900(ActivityThread.java:161)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1265)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:157)
            at android.app.ActivityThread.main(ActivityThread.java:5356)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
            at dalvik.system.NativeStart.main(Native Method)

最佳答案

我猜您在 Map.class 中遇到了 NullPointerException

Spinner mySpinner = (Spinner)findViewById(R.id.spinFood);
String text = mySpinner.getSelectedItem().toString();
EditText e = (EditText) findViewById (R.id.editText1);
e.setText(text);

您获得对 Spinner 的引用,然后尝试获取所选项目并将该项目转换为字符串。据我所知,您实际上还没有向微调器添加任何项目。我的猜测是,您正在尝试访问微调器中的一个对象,并且由于它不存在,因此返回 null。然后,您尝试调用 null 对象上的方法并获取 NPE。

这只是一个猜测。堆栈跟踪对于尝试诊断此问题非常有帮助。

我认为你出错的地方是你在 MainActivity 中填充了微调器,然后期望能够从不同 Activity 的微调器中选择一个项目。事情不是这样的。 Map.class 将无法引用 MainActivity.class 中的任何内容。您可以尝试将对象从 MainActivity.class 传递到 Map.class 或使用不同的数据传递方法,但尝试从 Map.class 引用 MainAcitivity.class 中的数据是行不通的。

编辑: 如果您只想将一个字符串从 MainActivity.class 传递到 Map.class,您可以将该字符串作为“额外”添加到用于启动 Map.class 的 Intent 中。

在您的 MainActivity.class 代码中。选择微调器中的项目后,创建一个 Intent 并使用 putExtra() 方法将字符串设置为额外内容。您将需要提供一个基本上标记额外内容的 key ,以便您可以在接收 Activity 和要发送的字符串中识别它。

Intent intent = new Intent(this, Map.class);
intent.putExtra("KEY_SPINNER_STRING", variableRepresentingString);
startActivity(intent);

在 Map.class Activity 中,在 onCreate() 方法中,您需要接收 Intent ,检查额外内容,然后解压额外内容。然后你就会得到字符串。

onCreate(Bundle savedInstanceState) {
    String spinnerString;
    if (getIntent() != null && getIntent().getExtras() != null) {
        Bundle bundle = getIntent().getExtras();
        if (bundle.getString("KEY_SPINNER_STRING") != null) {
            spinnerString = bundle.getString("KEY_SPINNER_STRING");
        }
    }
}

如果一切都正确完成,字符串将从 MainActivity.class 传递并由 Map.class 接收

关于java - 将微调项目存储在字符串值中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31271463/

相关文章:

java - 如何使用 JMenu 项在 JTextArea 中的单独行上显示整数?

java - DexMaker Mockito 是模拟 stub 、 spy 、部分还是什么?

android - 将非 Realm 对象存储到 Realm 数据库中

javascript - XSLT+JavaScript : using classes

javascript - JavaScript中变量字符串的XML解析

java - 如何使用图形应用程序在 java 中逐像素绘制圆?

java - playframework - 在自定义选择标签中设置列表参数

java - 如何测试 ViewGroup 的类型?

xml - 如何在 Perl 中将 YAML 转换为 XML?

java - Android Java 每毫秒绘制到 Canvas