2017-09-15 52 views
0

是否可以在静态方法中插入非静态变量?我试图把文本从编辑文本的值插入到电子表格API.I的批量更新方法,我想插入这些变量如何在Java中的静态方法中插入非静态变量?

private Editable sFName; 
    private Editable sLName; 
    private String sClass; 
    private Editable sEmail; 
    private String sSection; 
    private String sId; 

,但我无法插入他们,因为他们都是非静态变量。

下面是完整的代码

public class details extends Activity 
    implements EasyPermissions.PermissionCallbacks { 

    static final int REQUEST_ACCOUNT_PICKER = 1000; 
    static final int REQUEST_AUTHORIZATION = 1001; 
    static final int REQUEST_GOOGLE_PLAY_SERVICES = 1002; 
    static final int REQUEST_PERMISSION_GET_ACCOUNTS = 1003; 
    private static final String BUTTON_TEXT = "Call Google Sheets API"; 
    private static final String PREF_ACCOUNT_NAME = "accountName"; 
    private static final String[] SCOPES = { 
     SheetsScopes.SPREADSHEETS_READONLY 
    }; 
    public Editable sPhone; 
    GoogleAccountCredential mCredential; 
    ProgressDialog mProgress; 
    private Editable sFName; 
    private Editable sLName; 
    private String sClass; 
    private Editable sEmail; 
    private String sSection; 
    private String sId; 
    private TextView mOutputText; 

    public static List < List <Object>> getData() { 


     List <Object> data1 = new ArrayList <Object>(); 


     data1.add(sFName); 
     data1.add(sLName); 
     data1.add(sClass); 
     data1.add(sSection); 
     data1.add(sEmail); 
     data1.add(sPhone); 


     List < List <Object>> data = new ArrayList < List <Object>>(); 
     data.add(data1); 

     return data; 
    } 

    /** 
     * Create the main activity. 
     * 
     * @param savedInstanceState previously saved instance data. 
     */ 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.detaillay); 

     LinearLayout activityLayout = (LinearLayout) findViewById(R.id.mLayout); 

     LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
     LinearLayout.LayoutParams.MATCH_PARENT, 
     LinearLayout.LayoutParams.MATCH_PARENT); 
     activityLayout.setLayoutParams(lp); 
     activityLayout.setOrientation(LinearLayout.VERTICAL); 
     activityLayout.setPadding(16, 16, 16, 16); 

     ViewGroup.LayoutParams tlp = new ViewGroup.LayoutParams(
     ViewGroup.LayoutParams.WRAP_CONTENT, 
     ViewGroup.LayoutParams.WRAP_CONTENT); 


     mOutputText = new TextView(this); 
     mOutputText.setLayoutParams(tlp); 
     mOutputText.setPadding(16, 16, 16, 16); 
     mOutputText.setVerticalScrollBarEnabled(true); 
     mOutputText.setMovementMethod(new ScrollingMovementMethod()); 
     mOutputText.setText(
     "Click the \'" + BUTTON_TEXT + "\' button to test the API."); 
     activityLayout.addView(mOutputText); 

     mProgress = new ProgressDialog(this); 
     mProgress.setMessage("Calling Google Sheets API ..."); 

     setContentView(activityLayout); 

     // Initialize credentials and service object. 
     mCredential = GoogleAccountCredential.usingOAuth2(
     getApplicationContext(), Arrays.asList(SCOPES)) 
     .setBackOff(new ExponentialBackOff()); 


    } 

    /** 
     * Attempt to call the API, after verifying that all the preconditions are 
     * satisfied. The preconditions are: Google Play Services installed, an 
     * account was selected and the device currently has online access. If any 
     * of the preconditions are not satisfied, the app will prompt the user as 
     * appropriate. 
     */ 
    private void getResultsFromApi() { 
     if (!isGooglePlayServicesAvailable()) { 
     acquireGooglePlayServices(); 
     } else if (mCredential.getSelectedAccountName() == null) { 
     chooseAccount(); 
     } else if (!isDeviceOnline()) { 
     mOutputText.setText("No network connection available."); 
     } else { 
     new MakeRequestTask(mCredential).execute(); 
     } 
    } 

    /** 
     * Attempts to set the account used with the API credentials. If an account 
     * name was previously saved it will use that one; otherwise an account 
     * picker dialog will be shown to the user. Note that the setting the 
     * account to use with the credentials object requires the app to have the 
     * GET_ACCOUNTS permission, which is requested here if it is not already 
     * present. The AfterPermissionGranted annotation indicates that this 
     * function will be rerun automatically whenever the GET_ACCOUNTS permission 
     * is granted. 
     */ 
    @AfterPermissionGranted(REQUEST_PERMISSION_GET_ACCOUNTS) 
    private void chooseAccount() { 
     if (EasyPermissions.hasPermissions(
     this, Manifest.permission.GET_ACCOUNTS)) { 
     String accountName = getPreferences(Context.MODE_PRIVATE) 
     .getString(PREF_ACCOUNT_NAME, null); 
     if (accountName != null) { 
     mCredential.setSelectedAccountName(accountName); 
     getResultsFromApi(); 
     } else { 
     // Start a dialog from which the user can choose an account 
     startActivityForResult(
     mCredential.newChooseAccountIntent(), 
     REQUEST_ACCOUNT_PICKER); 
     } 
     } else { 
     // Request the GET_ACCOUNTS permission via a user dialog 
     EasyPermissions.requestPermissions(
     this, 
     "This app needs to access your Google account (via Contacts).", 
     REQUEST_PERMISSION_GET_ACCOUNTS, 
     Manifest.permission.GET_ACCOUNTS); 
     } 
    } 

    /** 
     * Called when an activity launched here (specifically, AccountPicker 
     * and authorization) exits, giving you the requestCode you started it with, 
     * the resultCode it returned, and any additional data from it. 
     * 
     * @param requestCode code indicating which activity result is incoming. 
     * @param resultCode code indicating the result of the incoming 
     *     activity result. 
     * @param data  Intent (containing result data) returned by incoming 
     *     activity result. 
     */ 
    @Override 
    protected void onActivityResult(
     int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     switch (requestCode) { 
     case REQUEST_GOOGLE_PLAY_SERVICES: 
     if (resultCode != RESULT_OK) { 
     mOutputText.setText(
      "This app requires Google Play Services. Please install " + 
      "Google Play Services on your device and relaunch this app."); 
     } else { 
     getResultsFromApi(); 
     } 
     break; 
     case REQUEST_ACCOUNT_PICKER: 
     if (resultCode == RESULT_OK && data != null && 
     data.getExtras() != null) { 
     String accountName = 
      data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME); 
     if (accountName != null) { 
      SharedPreferences settings = 
      getPreferences(Context.MODE_PRIVATE); 
      SharedPreferences.Editor editor = settings.edit(); 
      editor.putString(PREF_ACCOUNT_NAME, accountName); 
      editor.apply(); 
      mCredential.setSelectedAccountName(accountName); 
      getResultsFromApi(); 
     } 
     } 
     break; 
     case REQUEST_AUTHORIZATION: 
     if (resultCode == RESULT_OK) { 
     getResultsFromApi(); 
     } 
     break; 
     } 
    } 

    /** 
     * Respond to requests for permissions at runtime for API 23 and above. 
     * 
     * @param requestCode The request code passed in 
     *      requestPermissions(android.app.Activity, String, int, String[]) 
     * @param permissions The requested permissions. Never null. 
     * @param grantResults The grant results for the corresponding permissions 
     *      which is either PERMISSION_GRANTED or PERMISSION_DENIED. Never null. 
     */ 
    @Override 
    public void onRequestPermissionsResult(int requestCode, 
     @NonNull String[] permissions, 
     @NonNull int[] grantResults) { 
     super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
     EasyPermissions.onRequestPermissionsResult(
     requestCode, permissions, grantResults, this); 
    } 

    /** 
     * Callback for when a permission is granted using the EasyPermissions 
     * library. 
     * 
     * @param requestCode The request code associated with the requested 
     *     permission 
     * @param list  The requested permission list. Never null. 
     */ 
    @Override 
    public void onPermissionsGranted(int requestCode, List <String> list) { 
     // Do nothing. 
    } 

    /** 
     * Callback for when a permission is denied using the EasyPermissions 
     * library. 
     * 
     * @param requestCode The request code associated with the requested 
     *     permission 
     * @param list  The requested permission list. Never null. 
     */ 
    @Override 
    public void onPermissionsDenied(int requestCode, List <String> list) { 
     // Do nothing. 
    } 

    /** 
     * Checks whether the device currently has a network connection. 
     * 
     * @return true if the device has a network connection, false otherwise. 
     */ 
    private boolean isDeviceOnline() { 
     ConnectivityManager connMgr = 
     (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo networkInfo = connMgr.getActiveNetworkInfo(); 
     return (networkInfo != null && networkInfo.isConnected()); 
    } 

    /** 
     * Check that Google Play services APK is installed and up to date. 
     * 
     * @return true if Google Play Services is available and up to 
     * date on this device; false otherwise. 
     */ 
    private boolean isGooglePlayServicesAvailable() { 
     GoogleApiAvailability apiAvailability = 
     GoogleApiAvailability.getInstance(); 
     final int connectionStatusCode = 
     apiAvailability.isGooglePlayServicesAvailable(this); 
     Log.v("details", "Success"); 
     return connectionStatusCode == ConnectionResult.SUCCESS; 

    } 

    /** 
     * Attempt to resolve a missing, out-of-date, invalid or disabled Google 
     * Play Services installation via a user dialog, if possible. 
     */ 
    private void acquireGooglePlayServices() { 
     GoogleApiAvailability apiAvailability = 
     GoogleApiAvailability.getInstance(); 
     final int connectionStatusCode = 
     apiAvailability.isGooglePlayServicesAvailable(this); 
     if (apiAvailability.isUserResolvableError(connectionStatusCode)) { 
     showGooglePlayServicesAvailabilityErrorDialog(connectionStatusCode); 
     } 
    } 

    /** 
     * Display an error dialog showing that Google Play Services is missing 
     * or out of date. 
     * 
     * @param connectionStatusCode code describing the presence (or lack of) 
     *        Google Play Services on this device. 
     */ 
    void showGooglePlayServicesAvailabilityErrorDialog(
     final int connectionStatusCode) { 
     GoogleApiAvailability apiAvailability = GoogleApiAvailability.getInstance(); 
     Dialog dialog = apiAvailability.getErrorDialog(
     details.this, 
     connectionStatusCode, 
     REQUEST_GOOGLE_PLAY_SERVICES); 
     dialog.show(); 
    } 

    private void Go(List <String> output) { 
     mProgress.hide(); 
     if (output == null || output.size() == 0) { 
     mOutputText.setText("No results returned."); 
     } else { 
     output.add(0, "Data retrieved using the Google Sheets API:"); 
     mOutputText.setText(TextUtils.join("\n", output)); 
     Log.v("details", "Wofdad"); 

     } 
    } 

    public void onClick2(View v) { 

     mOutputText.setText(""); 
     getResultsFromApi(); 


    } 

    public void submitInfo(View view) { 

     EditText fName = (EditText) findViewById(R.id.Student_FName); 
     EditText lName = (EditText) findViewById(R.id.Student_LName); 
     Spinner spinner1 = (Spinner) findViewById(R.id.spinner1); 
     Spinner spinner2 = (Spinner) findViewById(R.id.spinner2); 
     EditText Email = (EditText) findViewById(R.id.email_address); 
     EditText Phone = (EditText) findViewById(R.id.Phone_no); 


     sPhone = Phone.getText(); 
     sFName = fName.getText(); 
     sLName = lName.getText(); 
     sClass = String.valueOf(spinner1.getSelectedItem()); 
     sEmail = Email.getText(); 
     sSection = String.valueOf(spinner2.getSelectedItem()); 

     sId = new StringBuilder(sFName.charAt(0)).append(sLName.charAt(0)).append(sClass.charAt(0)).append(sSection.charAt(0)).toString(); 
     mOutputText.setText(""); 
     getResultsFromApi(); 


    } 

    /** 
     * An asynchronous task that handles the Google Sheets API call. 
     * Placing the API calls in their own task ensures the UI stays responsive. 
     */ 
    private class MakeRequestTask extends AsyncTask < Void, Void, List <String>> { 
     private com.google.api.services.sheets.v4.Sheets mService = null; 
     private Exception mLastError = null; 

     MakeRequestTask(GoogleAccountCredential credential) { 
     HttpTransport transport = AndroidHttp.newCompatibleTransport(); 
     JsonFactory jsonFactory = JacksonFactory.getDefaultInstance(); 
     mService = new com.google.api.services.sheets.v4.Sheets.Builder(
     transport, jsonFactory, credential) 
     .setApplicationName("Google Sheets API Android Quickstart") 
     .build(); 
     } 

     /** 
     * Background task to call Google Sheets API. 
     * 
     * @param params no parameters needed for this task. 
     */ 
     @Override 
     protected List <String> doInBackground(Void...params) { 
     try { 
     return getDataFromApi(); 
     } catch (Exception e) { 
     mLastError = e; 
     cancel(true); 
     return null; 
     } 
     } 

     /** 
     * Fetch a list of names and majors of students in a sample spreadsheet: 
     * https://docs.google.com/spreadsheets/d/1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms/edit 
     * 
     * @return List of names and majors 
     * @throws IOException 
     */ 
     private List <String> getDataFromApi() throws IOException { 
     String spreadsheetId = "1_sidOscZwfzcs8VaHk4UT5NVUEXGvq9VdDxKDh_xZFU"; 
     int a = 2; 
     int sNo = 0; 
     String check = null; 
     String range = "Class Data!".concat("A" + a++ + ":B"); 
     List < List <Object>> arrData = getData(); 

     ValueRange oRange = new ValueRange(); 
     oRange.setRange(range); // I NEED THE NUMBER OF THE LAST ROW 
     oRange.setValues(arrData); 


     List <ValueRange> oList = new ArrayList < >(); 
     oList.add(oRange); 


     BatchUpdateValuesRequest oRequest = new BatchUpdateValuesRequest(); 
     oRequest.setValueInputOption("RAW"); 
     oRequest.setData(oList); 


     List <String> results = new ArrayList <String>(); 
     ValueRange response = this.mService.spreadsheets().values() 
     .get(spreadsheetId, range) 
     .execute(); 
     List < List <Object>> values = response.getValues(); 
     if (values != null) { 
     Log.v("MainActivity", "Wofdad"); 

     results.add("Name, Major"); 


     for (List row: values) { 


     String Str1 = String.valueOf(row.get(0)); 

     if (Str1.contains("0")) { 
      Log.v("if", Str1); 
      Log.v("if", range); 

      break; 
     } 

     if (!Str1.contains(check.concat(sId + String.valueOf(sNo)))) { 
      sId.concat(String.valueOf(sNo)); 
     } 
     sNo++; 


     range = "Class Data!".concat("A" + a++ + ":B"); 
     Log.v("for", range); 


     } 

     } 
     oRange.setRange(range); // I NEED THE NUMBER OF THE LAST ROW 
     BatchUpdateValuesResponse oResp1 = mService.spreadsheets().values().batchUpdate(spreadsheetId, oRequest).execute(); 

     return results; 
     } 


     @Override 
     protected void onPreExecute() { 
     mOutputText.setText(""); 
     mProgress.show(); 
     Log.v("details", "Worked"); 


     } 

     @Override 
     protected void onPostExecute(List <String> output) { 
     mProgress.hide(); 
     if (output == null || output.size() == 0) { 
     mOutputText.setText("No results returned."); 
     Log.v("details", "damn"); 
     } else { 
     output.add(0, "Data retrieved using the Google Sheets API:"); 
     mOutputText.setText(TextUtils.join("\n", output)); 
     Log.v("details", "Wofdad21"); 

     } 
     } 

     @Override 
     protected void onCancelled() { 
     mProgress.hide(); 

     if (mLastError != null) { 
     if (mLastError instanceof GooglePlayServicesAvailabilityIOException) { 
     showGooglePlayServicesAvailabilityErrorDialog(
      ((GooglePlayServicesAvailabilityIOException) mLastError) 
      .getConnectionStatusCode()); 
     } else if (mLastError instanceof UserRecoverableAuthIOException) { 
     startActivityForResult(
      ((UserRecoverableAuthIOException) mLastError).getIntent(), 
      details.REQUEST_AUTHORIZATION); 
     } else { 
     mOutputText.setText("The following error occurred:\n" + mLastError.getMessage()); 
     Log.v("details", "Worked2"); 
     } 
     } else { 
     mOutputText.setText("Request cancelled."); 
     } 
     } 
    } 
    } 

`

先谢谢了!

+0

你不能这样做... –

+0

你是什么意思_“插入”_?当然可以将它们作为参数传递。 – 1615903

回答

0

您不能在静态方法中使用非静态变量,反之亦然。 这有一个非常简单的原因: 非静态变量是在一个对象内部创建的。让我们以一个非静态变速的对象汽车。现在你有一个使用汽车速度的静态方法。在这个例子中可以正常工作,但让我们创建另一个对象车。 哪两个速度变量应该静态方法参考? 或者您可能没有创建任何车对象,因此不会有任何速度变量。

当然,您始终可以使用非静态变量作为方法参数。但我认为这不是重点。

相关问题