2017-07-25 114 views
1

我試過了所有想到的,我已經研究了2天了。我是Android新手。我最後的求救聲援我轉向了Stackoverflow的主人。引導我。EditText SetText獲取空值。從sql中檢索值通過php

Background.java

protected String doInBackground(String... params) {  
     String update_id = params[1]; 
     try { 
      URL url = new URL(update_url); 
      HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection(); 
      httpURLConnection.setRequestMethod("POST"); 
      httpURLConnection.setDoOutput(true); 
      OutputStream OS = httpURLConnection.getOutputStream(); 
      BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(OS,"UTF-8")); 
      String data = URLEncoder.encode("id","UTF-8") + "=" + URLEncoder.encode(update_id, "UTF-8"); 
      OS.write(data.getBytes()); 
      bufferedWriter.flush(); 
      OS.close(); 
      InputStream is = httpURLConnection.getInputStream(); 
      is.close(); 


      BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(url.openStream())); 
      String inputLine; 
      while((inputLine = bufferedReader.readLine()) != null){ 
       sb.append(inputLine); 
      } 

      return "update";} 
     @Override 
      protected void onPostExecute(String result) { 
      AccountDetailsFragment ac = new AccountDetailsFragment(); 
      ac.receiveDetails(sb);} 

AccountDetailsFragment.java

public class AccountDetailsFragment extends Fragment{ 

EditText update_id, update_address, update_name; 
String id = ""; 
String idd ,namee ,addresss, login_id; 
View v; 
public AccountDetailsFragment() { 
    // Required empty public constructor 
} 

public void receiveLoginID(String id){ 
    this.login_id = id; 
} 

public void receiveDetails(StringBuilder sb){ 
    String[] strArray = sb.toString().split(Pattern.quote("split")); 
    idd= strArray[0]; 
    namee= strArray[1]; 
    addresss= strArray[2]; 

    System.out.println("-*-*--*-*-*-*-*-*-*-*"); 
    System.out.println(idd); 
    System.out.println(namee); 
    System.out.println(addresss); 
    System.out.println("*-*-*-*-*-*-*-*-*-*-*"); 

} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 

    LayoutInflater lf = getActivity().getLayoutInflater(); 
    v = lf.inflate(R.layout.fragment_account_details, container, false); 

    update_id = (EditText) v.findViewById(R.id.et_id_edit); 
    update_name = (EditText) v.findViewById(R.id.et_Name_edit); 
    update_address = (EditText) v.findViewById(R.id.et_address_edit); 

    getActivity().setTitle("Account Details"); 

    Button update = (Button) v.findViewById(R.id.btnUpdate); 
    update.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      String method = "update"; 
      Background background = new Background(getContext()); 
      background.execute(method, login_id); 

      System.out.println("*/*/*/*/*/*/*/*/*/*/*/"); 
      System.out.println(idd); 
      System.out.println(namee); 
      System.out.println(addresss); 
      System.out.println("*/*/*/*/*/*/*/*/*/*/*/"); 

      update_id.setText(idd.toString()); 
      update_name.setText(namee.toString()); 
      update_address.setText(addresss.toString()); 

     } 
    }); 

    return v; 
}} 

Update.php

<?php 

    require "init.php"; 
    $update_id=$_POST["id"]; 

    $sql_query="select * from test where id = '$update_id'"; 

    $result = mysqli_query($con,$sql_query); 

    if ($result->num_rows > 0) { 
    // output data of each row 
    while($row = $result->fetch_assoc()) { 
     echo $row["id"]; 
     echo ("split"); 
     echo $row["name"]; 
     echo ("split"); 
     echo $row["address"]; 
    } 
    } else { 
     echo $update_id; 
    } 
    ?> 

logcat的

I/System.out: */*/*/*/*/*/*/*/*/*/*/ 
07-25 15:55:09.367 5914-5914/com.syntillate.aazif.aazifapp I/System.out: null 
07-25 15:55:09.367 5914-5914/com.syntillate.aazif.aazifapp I/System.out: null 
07-25 15:55:09.367 5914-5914/com.syntillate.aazif.aazifapp I/System.out: null 
07-25 15:55:09.367 5914-5914/com.syntillate.aazif.aazifapp I/System.out: 
*/*/*/*/*/*/*/*/*/*/*/ 

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.String.toString()' on a null object reference 
                       at com.syntillate.aazif.aazifapp.AccountDetailsFragment$1.onClick(AccountDetailsFragment.java:115) 
+0

我認爲你得到空值 – Anil

+0

你嘗試從瀏覽器調用PHP腳本?你有預期的產量嗎? – MilanG

+0

System.out.println(idd); System.out.println(namee); System.out.println(addresss);這一行的輸出是什麼?我認爲你得到了空值並嘗試idd.toString())。而不是toString()使用String.valueof(idd); –

回答

0

更改onPostExecute()這個

@Override protected void onPostExecute(String result) { receiveDetails(sb); }

,也使Background一個內部類,如果它是不是已經。

你正在做的:

AccountDetailsFragment ac = new AccountDetailsFragment(); ac.receiveDetails(sb);

創造AccountDetailsFragment一個新的實例並調用receiveDetails() 它不調用類更改值(IDD,namee &編輯部地址)。

+0

這不是一個內部類。這是一個獨立的課程。幫助我理解爲什麼我應該讓背景成爲內心階層。會有什麼區別。 – MA3STRO

+0

如果它是一個內部類,那麼它可以直接訪問外部類的'receiveDetails'。如果你不想讓內部類使'receiveDetails'成爲靜態的並且像'AccountDetailsFragment'那樣調用它。receiveDetails(sb)' – Adithya

+0

如果我使接收細節爲靜態,那麼我將無法訪問全局變量,主要是視圖。但是我可以嘗試在接收細節類中再次設置視圖並檢查它是否有效。 另外我發現從數據庫中獲取數據時出錯。它返回null。 – MA3STRO

0

你的doInBaground()函數返回String值「update」。這將來onPostExecute(字符串結果)方法,你會得到結果作爲「更新」。 receiveDetails(StringBuilder sb)的AccountDetailsFragment類,因爲你正在使用下面的條件分割字符串。

String [] strArray = sb.toString()。split(Pattern.quote(「split」));

strArray數組越來越null,因爲split函數不會返回任何與onPostExecute()相關的結果。

+0

它不應該爲空,因爲sb是一個全局變量,一旦通過php獲取數據,它將被保存在sb中。然後,我只是將該sb傳遞給AccountDetailsFragment類中的receiveDetails方法。問題是從sql數據庫中獲取數據。沒有任何內容被提取 – MA3STRO

+0

在這種情況下,在sb正在追加的while()中放置一個日誌。要交叉檢查它,請在onPostExecute()和receiveDetails()方法中插入一個日誌。如果它打印爲空,則可能是後端腳本的問題。 –

+0

它正在打印空值。後端腳本如? – MA3STRO