2013-03-05 22 views
0
E/AndroidRuntime(15518): FATAL EXCEPTION: main 
E/AndroidRuntime(15518): java.lang.RuntimeException: Unable to instantiate activity  ComponentInfo{com.cydeon.plasmamodz/com.cydeon.plasmamodz.Boots}:  java.lang.NullPointerException 
E/AndroidRuntime(15518): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2224) 
E/AndroidRuntime(15518): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2358) 
E/AndroidRuntime(15518): at android.app.ActivityThread.access$600(ActivityThread.java:154) 
E/AndroidRuntime(15518): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1248) 
E/AndroidRuntime(15518): at android.os.Handler.dispatchMessage(Handler.java:99) 
E/AndroidRuntime(15518): at android.os.Looper.loop(Looper.java:137) 
E/AndroidRuntime(15518): at android.app.ActivityThread.main(ActivityThread.java:5235) 
E/AndroidRuntime(15518): at java.lang.reflect.Method.invokeNative(Native Method) 
E/AndroidRuntime(15518): at java.lang.reflect.Method.invoke(Method.java:511) 
E/AndroidRuntime(15518): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795) 
E/AndroidRuntime(15518): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562) 
E/AndroidRuntime(15518): at dalvik.system.NativeStart.main(Native Method) 
E/AndroidRuntime(15518): Caused by: java.lang.NullPointerException 
E/AndroidRuntime(15518): at android.app.Activity.findViewById(Activity.java:1839) 
E/AndroidRuntime(15518): at com.cydeon.plasmamodz.Boots.<init>(Boots.java:47) 
E/AndroidRuntime(15518): at java.lang.Class.newInstanceImpl(Native Method) 
E/AndroidRuntime(15518): at java.lang.Class.newInstance(Class.java:1319) 
E/AndroidRuntime(15518): at android.app.Instrumentation.newActivity(Instrumentation.java:1054) 
E/AndroidRuntime(15518): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2215) 
E/AndroidRuntime(15518): ... 11 more 

該主題很混亂。讓我解釋。在我的應用程序中,我只有一個部分有超過70個按鈕。我有很多不同的部分。現在,每個按鈕都使用相同的佈局,因此每個按鈕都會啓動相同的活動,這樣我就不會創建70個獨立的類。現在,在這個新課程中,它必須顯示一個圖像並下載與拾取的bug相對應的文件(當單擊某個按鈕時)。因此,基本上,我需要一些方法來識別其他類中的按鈕,並說「如果按下按鈕x,顯示圖像y,如果按下按鈕y,則顯示圖像x。類似地,如果按下按鈕x,則下載文件y,如果按鈕y被按下,下載文件x等,我不知道如何判斷在前一課中按下了哪個按鈕,我真的需要幫助,我已經工作了2周,這已經讓我停下來,我找不到答案,這不是真的依賴於代碼,我將在整個應用程序中多次使用此方法,所以我不認爲需要發佈任何代碼。重申我的問題,多個按鈕啓動相同的活動,在那個活動中,我需要按照上一課中按下的按鈕來做東西,謝謝。:)Android - 按鈕:通過意圖/其他方式通過數據接收

編輯:這裏有一些代碼...

BootFragment.java:

package com.cydeon.plasmamodz; 

import java.io.File; 
import java.io.IOException; 
import java.util.concurrent.TimeoutException; 

import com.stericson.RootTools.RootTools; 
import com.stericson.RootTools.exceptions.RootDeniedException; 
import com.stericson.RootTools.execution.CommandCapture; 

import android.app.Fragment; 
import android.content.Intent; 
import android.os.Bundle; 
import android.os.Environment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.Button; 

public class BootFragment extends Fragment {{ 


    //Defining File Directory 
    File directory = new File(Environment.getExternalStorageDirectory() + "/plasma/boot"); 
    if(directory.exists() && directory.isDirectory()){ 
    //Do nothing. Directory is existent 
    }else{ 
    //Directory does not exist. Make directory (First time app users) 
    directory.mkdirs(); 
    } 

    File bkup = new File(Environment.getExternalStorageDirectory() + "/plasma/boot/bkup"); 
    if(bkup.exists() && bkup.isDirectory()){ 
    //Do nothing. Directory is existent 
    }else{ 
    //Directory does not exist. Make directory (First time app users) 
    bkup.mkdirs(); 
    }} 





@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.boot_frag, 
       container, false); 
    Button Ablue = (Button) view.findViewById(R.id.bABlue); 
    Button AblueR = (Button) view.findViewById(R.id.bABlueR); 
    Button Abokeh = (Button) view.findViewById(R.id.bAbokeh); 

    Ablue.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View arg0) { 
        Intent b = new Intent(getActivity(), Boots.class); 
        b.putExtra("Dragon", R.id.bABlue); 
        BootFragment.this.startActivity(b); 
      } 
      }); 

    AblueR.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View arg0) { 
         Intent c = new Intent(getActivity(), Boots.class); 
         c.putExtra("Xbox", R.id.bABlueR); 
         BootFragment.this.startActivity(c); 
       } 
       }); 

    Abokeh.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View arg0) { 
         Intent d = new Intent(getActivity(), Boots.class); 
         d.putExtra("GameB", R.id.bAbokeh); 
         BootFragment.this.startActivity(d); 
       } 
       }); 

    return view; 



}} 

Boots.java:

package com.cydeon.plasmamodz; 

import com.stericson.RootTools.*; 
import com.stericson.RootTools.exceptions.RootDeniedException; 
import com.stericson.RootTools.execution.CommandCapture; 

import java.io.BufferedInputStream; 
import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.OutputStream; 
import java.io.Reader; 
import java.net.URL; 
import java.net.URLConnection; 
import java.util.List; 
import java.util.concurrent.TimeoutException; 

import com.cydeon.plasmamodz.R; 

import android.app.ActionBar; 
import android.app.Activity; 
import android.app.DownloadManager; 
import android.app.ProgressDialog; 
import android.content.Context; 
import android.content.Intent; 
import android.content.pm.PackageManager; 
import android.content.pm.ResolveInfo; 
import android.net.Uri; 
import android.os.AsyncTask; 
import android.os.Build; 
import android.os.Bundle; 
import android.os.Environment; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import android.widget.ImageView; 
import android.widget.TextView; 
import android.widget.Toast; 

//Class for Boot Animation Blue Kindle 
public class Boots extends Activity { 

public static String TAG = "Boots"; 
Process process; 

private class DownloadFile extends AsyncTask<String, Integer, String>{ 
    @Override 
    protected String doInBackground(String... sURL) { 
     try{ 
      URL url = new URL(sURL[0]); 
      URLConnection connection = url.openConnection(); 
      connection.connect(); 
      //Shows 0-100% progress bar 
      int fileLength = connection.getContentLength(); 

      //Download the file 
      InputStream input = new BufferedInputStream(url.openStream()); 
      OutputStream output = new FileOutputStream("/sdcard/plasma/boot/b..ootanimation.zip"); 

      byte data[] = new byte[1024]; 
      long total = 0; 
      int count; 
      while ((count = input.read(data)) != -1) { 
       total += count; 
       //Publish the Progress 
       publishProgress((int) (total * 100/fileLength)); 
       output.write(data, 0, count); 
       } 

      output.flush(); 
      output.close(); 
      input.close(); 
    } catch (Exception e) { 

    } 
    return null; 
    } 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     mProgressDialog.show(); 
    } 

    @Override 
    protected void onProgressUpdate(Integer... progress){ 
     super.onProgressUpdate(progress); 
     mProgressDialog.setProgress(progress[0]); 



    } 

    @Override 
    protected void onPostExecute(String result) { 
     // TODO Auto-generated method stub 
     super.onPostExecute(result); 
     mProgressDialog.dismiss(); 
     Context context = getApplicationContext(); 
     CharSequence text = "Installing. Please Wait"; 
     int duration = Toast.LENGTH_SHORT; 

     Toast toast = Toast.makeText(context, text, duration); 
     toast.show(); 

     if (RootTools.isBusyboxAvailable()){ 
      RootTools.remount("/system", "rw"); 
      CommandCapture command = new CommandCapture(0, "su", "sh /sdcard/plasma/scripts/boots.sh"); 
       try { 
        RootTools.getShell(true).add(command).waitForFinish(); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } catch (TimeoutException e) { 
        e.printStackTrace(); 
       } catch (RootDeniedException e) { 
        e.printStackTrace(); 
       } 

     } else { 
      RootTools.offerBusyBox(Boots.this); 
     } 

    } 
} 

ProgressDialog mProgressDialog; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.boots); 
    ActionBar actionBar = getActionBar(); 
    actionBar.hide(); 
    ImageView img = (ImageView) findViewById(R.id.iv2); 
    img.setImageResource(R.drawable.boot1); 
    Button install = (Button) findViewById(R.id.bAInstall); 
    Button rtrn = (Button) findViewById(R.id.bAReturn); 
    mProgressDialog = new ProgressDialog(Boots.this); 
    mProgressDialog.setMessage("Downloading..."); 
    mProgressDialog.setIndeterminate(false); 
    mProgressDialog.setMax(100); 
    mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 

    install.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View arg0) { 
      TextView creator = (TextView) findViewById(R.id.tvCreate); 
      Intent bootI = getIntent(); 
      int dball = getIntent().getExtras().getInt("Dragon", -1); 
      int xbox = getIntent().getExtras().getInt("Xbox", -1); 
      int GameB = getIntent().getExtras().getInt("GameB", 1); 
      if (dball != -1){ 
      DownloadFile downloadFile = new DownloadFile(); 
      downloadFile.execute("http:\\correspondingurl"); 
      creator.setText("Dragon Ball"); 
      }if (xbox != -1){ 
       DownloadFile downloadFile = new DownloadFile(); 
       downloadFile.execute("http:\\correspondingurl"); 
       creator.setText("Xbox"); 
      }if (GameB != -1){ 
       DownloadFile downloadFile = new DownloadFile(); 
       downloadFile.execute("http:\\correspondingurl"); 
       creator.setText("GameBoy"); 
      } 


      } 

     } 
    ); 

    rtrn.setOnClickListener(new View.OnClickListener() { 

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

    } 



} 

我已經嘗試了許多不同的方法。這是我最近的嘗試。他們都沒有工作。

貓日誌:頂一下......

+0

你有一個具體的問題?代碼是做什麼的?它與你想要的有什麼不同? – 2013-03-05 02:02:54

+0

我想我至少說了三次我的問題。現在的代碼是打開這個新課程,目前這是所有的工作..再次,我想要的是我所要求的。 – user2128299 2013-03-05 02:16:16

回答

1

傳遞所需信息在Intent新的活動,通過Intent.putExtra() (見http://developer.android.com/reference/android/content/Intent.html

+0

我知道如何使用putExtra(),但是在意圖打開的活動中,我可以根據按下的按鈕讓它下載並顯示。或者沒有任何反應,或者每次都顯示sams事物。 – user2128299 2013-03-05 01:51:30

+0

如何向我們展示一些代碼? – GreyBeardedGeek 2013-03-05 01:53:37

+0

好的。請等一下。感謝你們對我的幫助。 – user2128299 2013-03-05 01:54:48

0

您可以嘗試分配每個按鈕a unique name/id。點擊按鈕時,檢索其名稱並使用Intent.putExtra()將其傳遞給新活動。在新活動中,一旦獲得了這些信息,就可以相應地執行所需的功能。

示例代碼:

在XML爲按鈕,爲此

android:onClick="OnButtonClick" 

在第一活動的代碼,定義OnButtonClick爲:

public void OnButtonClick(View v) { 
     switch (v.getId()) { 
     case R.id.button1: 
      doSomething1(); //Intent.putExtra(ButtonID) 
      break; 
     case R.id.button2: 
      doSomething2(); 
      break; 
    } 

}

在第二活動,檢索此ID並有類似的switch-case根據按鈕的ID執行操作。

希望這是有道理的!

+0

謝謝。我也會試試這個。 – user2128299 2013-03-05 21:31:18

+0

你能告訴我一個例子嗎? – user2128299 2013-03-05 22:52:21

+0

@ user2128299:我猜@Rakesh Bhalani已經把我在代碼中提到的東西。就你的情況而言,關於'NullPointerException',請確保你添加的新活動也存在於'Manifest'文件中。 – 2013-03-06 05:21:27

0

在你的片段類,請執行下列操作:

public class BootFragment extends Fragment implements android.view.View.OnClickListener{ 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { 
     Button Ablue = (Button) view.findViewById(R.id.bABlue); 
     Button AblueR = (Button) view.findViewById(R.id.bABlueR); 
     Button Abokeh = (Button) view.findViewById(R.id.bAbokeh); 

     Ablue.setOnClickListener(this); 
     AblueR.setOnClickListener(this); 
     Abokeh.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View v) { 
     int btnId = v.getId(); 
     Intent d = new Intent(getActivity(), Boots.class); 
     d.putExtra("BUTTON_ID", btnId); 
     startActivity(d); 
    } 
} 

在靴。Java中,請執行下列操作:

public class Boots extends Activity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

     int btnId = getIntent().getExtras().getInt("BUTTON_ID", -1); 
     switch(btnId){ 
      case: R.id.your_btn_id_1: 
      // logic for your button press 
      break; 
      case: R.id.your_btn_id_2: 
      // logic for your button press 
      break; 
      case: R.id.your_btn_id_n: 
      // logic for your button press 
      break; 
     } 
    } 
} 

注意:您應該提供唯一的ID給每個按鈕佈局xml文件

+0

對不起。我沒有看到這個答案。看起來很容易。我應該如何做到你放入BootsFragment的內容? – user2128299 2013-03-05 21:06:04

+0

我試過了。我把靴子碎片中所說的完全放進去,靴子上放上了正確的ID。當我點擊靴子片段中的按鈕時,應用程序關閉。 – user2128299 2013-03-05 22:51:15

+0

我在帖子中添加了一個日誌貓。請幫助我... – user2128299 2013-03-06 03:22:09