简体   繁体   English

NullPointerException OnClickListener

[英]NullPointerException at OnClickListener

I'm getting a NullPointerException at the line: 我在行中收到NullPointerException:

mAssistInstrButton.setOnClickListener(this);

however I don't see any reason it should be occurring. 但是我看不出它应该发生的任何原因。

Any input is greatly appreciated. 任何输入,不胜感激。

LOGCAT: LOGCAT:

08-15 15:19:25.090: E/AndroidRuntime(24692): FATAL EXCEPTION: main
08-15 15:19:25.090: E/AndroidRuntime(24692): java.lang.NullPointerException
08-15 15:19:25.090: E/AndroidRuntime(24692):    at com.project.new.datasettings.ConfigFinalActivity.onClick(ConfigFinalActivity.java:182)
08-15 15:19:25.090: E/AndroidRuntime(24692):    at android.view.View.performClick(View.java:3511)
08-15 15:19:25.090: E/AndroidRuntime(24692):    at android.view.View$PerformClick.run(View.java:14111)
08-15 15:19:25.090: E/AndroidRuntime(24692):    at android.os.Handler.handleCallback(Handler.java:605)
08-15 15:19:25.090: E/AndroidRuntime(24692):    at android.os.Handler.dispatchMessage(Handler.java:92)
08-15 15:19:25.090: E/AndroidRuntime(24692):    at android.os.Looper.loop(Looper.java:137)
08-15 15:19:25.090: E/AndroidRuntime(24692):    at android.app.ActivityThread.main(ActivityThread.java:4429)
08-15 15:19:25.090: E/AndroidRuntime(24692):    at java.lang.reflect.Method.invokeNative(Native Method)
08-15 15:19:25.090: E/AndroidRuntime(24692):    at java.lang.reflect.Method.invoke(Method.java:511)
08-15 15:19:25.090: E/AndroidRuntime(24692):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
08-15 15:19:25.090: E/AndroidRuntime(24692):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:558)
08-15 15:19:25.090: E/AndroidRuntime(24692):    at dalvik.system.NativeStart.main(Native Method)

SOURCE: 资源:

project com.project.new.datasettings;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import javax.xml.parsers.ParserConfigurationException;

import org.xml.sax.SAXException;

import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.database.SQLException;
import android.net.Uri;
import android.os.Build;
import android.os.Build.VERSION_CODES;
import android.os.Bundle;
import android.provider.Settings;
import android.telephony.TelephonyManager;
import android.text.Html;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class ConfigFinalActivity extends Activity implements OnClickListener {
    private static final String TAG = "ConfigActivity";
    TelephonyManager tm;
    AlertDialog mErrorAlert = null;
    private Notification mNotification = null;
    private Button mXButton = null;
    private Button mAssistUpdateButton = null;
    private Button mAssistInstrButton = null;
    private Button mReadAgainButton = null;
    private int mInstructionNumber = 0;
    public static ArrayList<String> NameArr = new ArrayList<String>();
    public static ArrayList<String> ValueArr = new ArrayList<String>();
    public static ArrayList<String> nameArr = new ArrayList<String>();
    public static ArrayList<String> ApnArr = new ArrayList<String>();
    public static ArrayList<String> mmscArr = new ArrayList<String>();
    public static ArrayList<String> mmsportArr = new ArrayList<String>();
    public static ArrayList<String> mmsproxyArr = new ArrayList<String>();
    public static ArrayList<String> portArr = new ArrayList<String>();
    public static ArrayList<String> proxyArr = new ArrayList<String>();
    public static int count;
    public static int TotalSteps = 8;
    int i, g = 0, result = 0;
    String Result = "";
    public static ContentValues Values = new ContentValues();
    XmlParserHandlerFinal handler;

    public static final Uri APN_TABLE_URI = Uri
            .parse("content://telephony/carriers");
    public static String Base_URL = "https://www.mysettings.com/";
    public static InputStream stream = null;
    UpdateActivity update;
    public static String status;

    /** Called when the activity is first created. */
    @SuppressLint("NewApi")
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        int version = android.os.Build.VERSION.SDK_INT;
        tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
        update = new UpdateActivity();
        nameArr = update.getnameArr();
        ApnArr = update.getApnArr();
        mmscArr = update.getMMSCArr();
        mmsproxyArr = update.getMmscProxyArr();
        mmsportArr = update.getMmsPortArr();
        proxyArr = update.getMmscProxyArr();
        portArr = update.getMmsPortArr();
        count = update.getCount();
        if (ApnArr.isEmpty() || mmscArr.isEmpty() || mmsportArr.isEmpty()
                || mmsproxyArr.isEmpty() || proxyArr.isEmpty()
                || portArr.isEmpty()) {
            tryagain();
        } else if (version < VERSION_CODES.ICE_CREAM_SANDWICH) {

            // Update APN table
            try {
                result = updateTable();
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }// Settings updated with this atomic call
            catch (SAXException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (ParserConfigurationException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            if (result != -1) {
                status = "success";

            } else {
                status = "failure";
            }

            if (status.equals("success")) {
                completeUpdate();
            } else if (status.equals("failure")) {
                tryagain();
                // showAlert(getString(R.string.unchanged_net10_dialog));
            }

        } else {// ICS and later versions

            // Reduce number of steps to 6
            TotalSteps = 6;
            setContentView(R.layout.assist_update);
    //      String assistUpdate = getString(R.string.instructions_1);
    //      CharSequence styledText = Html.fromHtml(assistUpdate);
            TextView assistText = (TextView) findViewById(R.id.apn_app_text_cta2);
    //      assistText.setText(styledText);
            mAssistUpdateButton = (Button) findViewById(R.id.assist_update_btn);
            mAssistUpdateButton.setOnClickListener(this);

        }
    }

    public void onClick(View v) {
        switch(v.getId()) {
        case R.id.assist_update_btn:

            // Update button for ICS and up is selected
            // Get the TextView in the Assist Update UI

            TextView tv = (TextView) findViewById(R.id.apn_app_text_cta2);
            String text = "";
            CharSequence styledText = text;
            switch (mInstructionNumber) {

            case 0:
                // Retrieve the instruction string resource corresponding the
                // 2nd set of instructions
                text = String.format(getString(R.string.apn_app_text_instr),
                        TotalSteps);
                styledText = Html.fromHtml(text);
                // Update the TextView with the correct set of instructions
                tv.setText(styledText);
                // Increment instruction number so the correct instructions
                // string resource can be retrieve the next time the update
                // button is pressed
                mInstructionNumber++;
                break;
            case 1:
                text = getString(R.string.apn_app_text_instr2);
                styledText = Html.fromHtml(text);
                tv.setText(styledText);
                // Increment instruction number so the correct instructions
                // string resource can be retrieve the next time the update
                // button is pressed
                mInstructionNumber++;
                break;

            case 2:
                // Final set of instructions-Change to the corresponding layout

                setContentView(R.layout.assist_instructions);
                String assistUpdateInstr = String.format(
                        getString(R.string.apn_app_text_instr3), TotalSteps);
                styledText = Html.fromHtml(assistUpdateInstr);
                TextView assistInstrText = (TextView) findViewById(R.id.updated_text);
                assistInstrText.setText(styledText);
                mAssistInstrButton = (Button) findViewById(R.id.assist_update_btn);
                //mReadAgainButton = (Button) findViewById(R.id.read_again_btn);
                mAssistInstrButton.setOnClickListener(this);
                // mReadAgainButton.setOnClickListener(this);

                // "LET'S DO THIS" Button in final instructions screen for ICS
                // and
                // up is selected
                // Create ConfigActivity Intent
                // Intent i = new Intent(this,
                // NotificationActivityForMultiProf.class);
                // Invoke ConfigActivity Intent to start the assisted update
                // startActivity(i);
                // finish();

                // startActivity(new Intent(Settings.ACTION_APN_SETTINGS));
            }
        }  if (v == mAssistInstrButton) {

            // mAssistUpdateButton = (Button)
            // findViewById(R.id.assist_update_btn);
            // mAssistUpdateButton.setOnClickListener(this);
            startActivity(new Intent(Settings.ACTION_APN_SETTINGS));

            try {
                showNotification();
            } catch (SAXException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (ParserConfigurationException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            finish();// } else if (v == mReadAgainButton) {




            // go back to set of instructions if read again is selected
        //  mInstructionNumber = 2;

    //      setContentView(R.layout.screen5);
////            String one_text = String
////                    .format(getString(R.string.one), TotalSteps);
////            CharSequence styledText_one = Html.fromHtml(one_text);
//          TextView one = (TextView) findViewById(R.id.text_one);
//          one.setTextSize(18);
//          one.setText(styledText_one);
//          String two_text = String
//                  .format(getString(R.string.two), TotalSteps);
//          CharSequence styledText_two = Html.fromHtml(two_text);
//          TextView two = (TextView) findViewById(R.id.text_two);
//          two.setTextSize(18);
//          two.setText(styledText_two);
//          String three_text = String.format(getString(R.string.three),
//                  TotalSteps);
//          CharSequence styledText_three = Html.fromHtml(three_text);
//          TextView three = (TextView) findViewById(R.id.text_three);
//          three.setTextSize(18);
//          three.setText(styledText_three);
    //      mAssistUpdateButton = (Button) findViewById(R.id.assist_instr_btn);
        //  mAssistUpdateButton.setOnClickListener(this);

        }
    }



    /*
     * Insert a new APN entry into the system APN table Require an apn name, and
     * the apn address. More can be added. Return an id (_id) that is
     * automatically generated for the new apn entry.
     */
    public int InsertAPN() throws SecurityException {

        int id = -1;
        for (i = 0; i < count; i++) {
            ContentValues values2 = new ContentValues();
            // values2 = values1;
            values2 = getValues();
            ContentResolver resolver = getContentResolver();
            Cursor c = null;
            try {
                Uri newRow = resolver.insert(APN_TABLE_URI, values2);
                // System.out.println("values in insertAPN" + values1);
                if (newRow != null) {
                    c = resolver.query(newRow, null, null, null, null);
                    Log.d(TAG, "Newly added APN:");
                    // TF Settings have been inserted
                    // Obtain the apn id
                    int idindex = c.getColumnIndex("_id");
                    c.moveToFirst();
                    id = c.getShort(idindex);

                    Log.d(TAG, "New ID: " + id
                            + ": Inserting new APN succeeded!");
                }
            } catch (SQLException e) {
                Log.d(TAG, e.getMessage());
            }
            if (c != null)
                c.close();
        }
        return id;

    }

    public ContentValues getValues() {
        ContentValues values = new ContentValues();

        values.put("name", nameArr.get(i));
        values.put("apn", ApnArr.get(i));
        values.put("mmsc", mmscArr.get(i));
        values.put("mmsproxy", mmsproxyArr.get(i));
        values.put("mmsport", mmsportArr.get(i));
        values.put("proxy", proxyArr.get(i));
        values.put("port", portArr.get(i));
        values.put("mcc", (getString(R.string.mcc)));
        if ((tm.getSimOperator()).equals(getString(R.string.numeric_tmo))) {
            values.put("numeric", getString(R.string.numeric_tmo));
            values.put("mnc", (getString(R.string.mnc_tmo)));
        } else if ((tm.getSimOperator())
                .equals(getString(R.string.numeric_att))) {
            values.put("numeric", getString(R.string.numeric_att));
            values.put("mnc", (getString(R.string.mnc_att)));
        }
        return values;
    }

    /*
     * Delete APN data where the indicated field has the values Entire table is
     * deleted if both field and value are null
     */
    private void DeleteAPNs(String field, String[] values)
            throws SecurityException {
        int c = 0;
        c = getContentResolver().delete(APN_TABLE_URI, null, null);
        if (c != 0) {
            String s = "APNs Deleted:\n";
            Log.d(TAG, s);

        }

    }

    /*
     * Return all column names stored in the string array
     */
    private String getAllColumnNames(String[] columnNames) {
        String s = "Column Names:\n";
        for (String t : columnNames) {
            s += t + ":\t";
        }
        return s + "\n";
    }

    /*
     * Copy all data associated with the 1st record Cursor c. Return a
     * ContentValues that contains all record data.
     */
    private ContentValues copyRecordFields(Cursor c) {
        if (c == null)
            return null;
        int row_cnt = c.getCount();
        Log.d(TAG, "Total # of records: " + row_cnt);
        ContentValues values = new ContentValues();//
        if (c.moveToFirst()) {
            String[] columnNames = c.getColumnNames();
            Log.d(TAG, getAllColumnNames(columnNames));
            String row = "";
            for (String columnIndex : columnNames) {
                int i = c.getColumnIndex(columnIndex);
                row += c.getString(i) + ":\t";
                // if (i>0)//Avoid copying the id field
                // id to be auto-generated upon record insertion
                values.put(columnIndex, c.getString(i));
            }
            row += "\n";
            Log.d(TAG, row);
            Log.d(TAG, "End Of Records");
        }
        return values;
    }

    // showAlert displays the text contained in message as an alert
    public void showAlert(String message) {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setMessage(message).setPositiveButton("OK",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        ConfigFinalActivity.this.finish();
                    }
                });
        mErrorAlert = builder.create();
        mErrorAlert.show();
    }

    // showErrorAlert displays an alert with layout and a title
        private void showErrorAlert(int layoutRes, String title) {
            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            // Get the layout inflater
            LayoutInflater inflater = ConfigFinalActivity.this.getLayoutInflater();

            // Inflate and set the layout for the dialog
            // Pass null as the parent view because its going in the dialog layout
            builder.setTitle(title)
                    .setView(inflater.inflate(layoutRes, null))
                    .setPositiveButton(getString(R.string.assisted_button),
                            new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int id) {
                                    startActivity(new Intent(
                                            Settings.ACTION_APN_SETTINGS));
                                    try {
                                        showNotification();
                                    } catch (SAXException e) {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                    } catch (ParserConfigurationException e) {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                    }
                                }
                            });
            mErrorAlert = builder.create();
            mErrorAlert.show();
        }

    // showNotification starts the process of sending notifications to the bar
    // to assist the user in updating the data settings on ICS and later
    // versions of Android
    @SuppressWarnings("deprecation")
    @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
    void showNotification() throws SAXException, ParserConfigurationException {

        String field = getString(R.string.config_name_label);

        String value = Values.get("name").toString();
        int mId = 1;
        String title = "1 of " + TotalSteps + " (Update " + field + ":)";
        Notification.Builder mBuilder = new Notification.Builder(this)
                .setSmallIcon(R.drawable.ic_launcher)
                .setContentTitle(title).setContentText(value);
        Intent resultIntent = new Intent(this, NotificationActivityForMultiProf.class);
        resultIntent.putExtra(field, value);
        PendingIntent resultPendingIntent = PendingIntent.getActivity(
                getApplicationContext(), 0, resultIntent,
                PendingIntent.FLAG_UPDATE_CURRENT);
        mBuilder.setContentIntent(resultPendingIntent);
        NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        // mId allows you to update the notification later on.
        mNotification = mBuilder.getNotification();
        mNotification.flags |= Notification.FLAG_AUTO_CANCEL;
        mNotificationManager.notify(mId, mNotification);
        finish();
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        // TODO Auto-generated method stub
        super.onSaveInstanceState(outState);
        if (mNotification != null) {
            outState.putString("NOTIFICATIONB", mNotification.toString());
        }
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        if (mErrorAlert != null)
            mErrorAlert.dismiss();
    }

    private int updateTable() throws IOException, SAXException,
            ParserConfigurationException {
        int insertResult = -1;
        // returned value if table is not properly updated

        try {

            ContentValues values = new ContentValues();
            // Query the carrier table for the current data settings
            Cursor c = getContentResolver().query(APN_TABLE_URI, null,
                    "current=?", new String[] { "1" }, null);
            values = copyRecordFields(c);
            // Copy the NET10 settings into values

            // Replace T-Mo/ATT Data settings if there is no SIM or
            // NET10/T-Mo/ATT SIM is
            // present
            if (tm.getSimState() == TelephonyManager.SIM_STATE_ABSENT
                    || (tm.getSimOperator())
                            .equals(getString(R.string.numeric_tmo))) {

                // delete all APNs before adding new APNs
                DeleteAPNs("numeric=?",
                        new String[] { getString(R.string.numeric_tmo) });
                // Insert NET10 Data Settings into Carrier table

                insertResult = InsertAPN();

            } else if (tm.getSimState() == TelephonyManager.SIM_STATE_ABSENT
                    || (tm.getSimOperator())
                            .equals(getString(R.string.numeric_att))) {
                // Delete all APNs before adding new APNs
                DeleteAPNs("numeric=?",
                        new String[] { getString(R.string.numeric_att) });
                // Insert NET10 Data Settings into Carrier table

                insertResult = InsertAPN();

    //      } else
                // non NET10/ non T-Mo SIM/non ATT SIM
        //      showAlert(getString(R.string.insert_net10_dialog));
            }   } catch (SecurityException e) {
        //  showErrorAlert(R.layout.assisted_settings,
        //          getString(R.string.assited_title));
            Log.d(TAG, e.getMessage());
        }
        return insertResult;
    }

    private void completeUpdate() {
        // Displaying final layout after pre-ICS automatic settings update
        setContentView(R.layout.completion);
    //  TextView mCompleted = (TextView) findViewById(R.id.done_text1);
    //  String mDoneText = String.format(getString(R.string.done_text1));
    //  CharSequence styledText = Html.fromHtml(mDoneText);

    //  mCompleted.setText(styledText);
        mAssistUpdateButton = (Button) findViewById(R.id.assist_update_btn);
        mAssistUpdateButton.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                finish();
            }
        });
    }

    public void tryagain() {
        // Displaying final layout after failure of pre-ICS automatic settings
        // update
        //setContentView(R.layout.tryagain);
        String tryAgainText = "";
        CharSequence styledTryAgainText;
//
//      tryAgainText = String.format(getString(R.string.tryagain_text1),
//              TotalSteps);
//      styledTryAgainText = Html.fromHtml(tryAgainText);
//      TextView tryAgain1 = (TextView) findViewById(R.id.tryagain_text1);
//      tryAgain1.setText(styledTryAgainText);
//
//      tryAgainText = String.format(getString(R.string.tryagain_text2),
//              TotalSteps);
//      styledTryAgainText = Html.fromHtml(tryAgainText);
//      TextView tryAgain2 = (TextView) findViewById(R.id.tryagain_text2);
//      tryAgain2.setText(styledTryAgainText);
//
//      tryAgainText = String.format(getString(R.string.tryagain_text3),
//              TotalSteps);
//      styledTryAgainText = Html.fromHtml(tryAgainText);
//      TextView tryAgain3 = (TextView) findViewById(R.id.tryagain_text3);
//      tryAgain3.setText(styledTryAgainText);

    }

    // This function return a cursor to the table holding the
    // the APN configurations (Carrier table)
    public Cursor getConfigTableCursor() {
        return getContentResolver()
                .query(APN_TABLE_URI, null, null, null, null);
    }

    public ArrayList<String> getnameArr() {

        return nameArr;
    }

    public ArrayList<String> getApnArr() {

        return ApnArr;
    }

    public ArrayList<String> getMMSCArr() {

        return mmscArr;
    }

    public ArrayList<String> getMmscProxyArr() {

        return mmsproxyArr;
    }

    public ArrayList<String> getMmsPortArr() {

        return mmsportArr;
    }

    public int getCount() {
        return count;
    }

    public ArrayList<String> getProxyArr() {

        return proxyArr;
    }

    public ArrayList<String> getPortArr() {

        return portArr;
    }

}

You call: 您致电:

mAssistInstrButton = (Button) findViewById(R.id.assist_update_btn);

From the documentation: 从文档中:

 public View findViewById (int id) 

Finds a view that was identified by the id attribute from the XML that was processed in onCreate(Bundle). 从onCreate(Bundle)中处理的XML中查找一个由id属性标识的视图。 Returns 退货

The view if found or null otherwise. 如果找到该视图,否则返回null。

So, assist_update_btn does not exist in R.id . 因此, assist_update_btn存在R.id Check spelling/location of assist_update_btn . 检查assist_update_btn拼写/位置。

As Nobu's comment says, it's a little difficult to determine the exact line responsible with a code excerpt and no line numbers, but I found these three lines in your code close to line 182 with the third line matching the line you asked about: 正如Nobu的评论所说,要确定确切的行与代码摘录没有行号有点困难,但是我发现代码中的这三行接近第182行,第三行与您询问的行匹配:

 mAssistInstrButton = (Button) findViewById(R.id.assist_update_btn);
 //mReadAgainButton = (Button) findViewById(R.id.read_again_btn);
 mAssistInstrButton.setOnClickListener(this);

I would expect a NullPointerException here if mAssistInstrButton was null, so I would suggest checking (either by adding logging or using a debugger) to make sure the findViewById(R.id.assist_update_btn) method call is returning something other than null. 如果mAssistInstrButton为null,我希望在这里出现NullPointerException,所以我建议检查(通过添加日志记录或使用调试器),以确保findViewById(R.id.assist_update_btn)方法调用返回的不是null。 Are you certain passing R.id.assist_update_btn to that method will a Button instance and not null? 您确定将R.id.assist_update_btn传递给该方法时,Button实例而不是null吗?

findViewById is apparently returning a null value. findViewById显然返回null值。 You could wrap it in an if condition to check for that case, or you could edit the findViewById function itself. 您可以将其包装在if条件中以检查该情况,也可以编辑findViewById函数本身。

Hard to be more specific with the excerpt you've posted. 很难用您发布的摘录更加具体。

The logcat directs to the fact that the view to which you are assigning a listener doesn't exist ie; logcat指出一个事实,即您要为其分配侦听器的视图不存在,即; their is no view with ID assist_update_btn , thats why you are getting NullPointerException when you try to assign clickListener to a button that doesn't exist in your layout. 它们不是ID为assist_update_btn视图,这就是为什么当您尝试将clickListener分配给布局中不存在的按钮时会出现NullPointerException的原因。

As the others say: it could be that findViewById returns null because the view could not be found. 正如其他人所说:findViewById可能返回null,因为找不到该视图。

But it can also be a rare glitch in the build process, which also happened to me a few times during Android app development. 但这在构建过程中也可能是一个罕见的故障,在Android应用程序开发过程中也发生过几次。 Code portions that used to work all the time suddenly crash with NullPointerExceptions. 过去一直工作的代码部分突然因NullPointerExceptions而崩溃。

The build process can be a bit shaky sometimes and resources do not get correctly processed or updated. 有时构建过程可能会有些不稳定,并且资源没有得到正确的处理或更新。 If you are sure that the view exists and the id is correct (if it used to work for you all the time before) then clean your workspace and build the app project new from scratch. 如果您确定该视图存在且ID是正确的(如果以前一直为您工作),则请清理工作区并从头开始构建新的应用程序项目。

This can even happen sometimes with drawable and string resources, they can get switched and messed up. 有时使用可绘制和字符串资源可能会发生这种情况,它们可能会切换并弄乱。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM