2013-04-15 58 views
-2

親愛的用戶在stackoverflow我最近添加了一個新的比賽,我的應用程序「(MinePedia)」和贏家收到免費比賽冠軍應用程序插件「(com.shadycorp) 「如果用戶安裝了比賽插件」(com.shadycorp)「,我希望我的應用程序主要活動在運行時顯示備用layout.xml,並且如果嘗試實現我想要的結果並使用它,我的應用程序崩潰,我每次啓動時間it.So可以在這裏請人幫我應用程序崩潰,而試圖改變運行時的主佈局

這裏是(Minepedia)在MainActivity

package com.shadycorp.minecraftrecipebook; 

public class MainActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState);  
     Button button2 = (Button) findViewById(R.id.button1); 
      button2.setOnClickListener(new OnClickListener() {   
       public void onClick(View v) { 
        startActivity(new Intent(getApplicationContext(), MainActivity2.class)); 
       } 
      }); 

      Button button9 = (Button) findViewById(R.id.info); 
      button9.setOnClickListener(new OnClickListener() {   
       public void onClick(View v) { 
        startActivity(new Intent(getApplicationContext(), AppInf.class));  
       } 
      }); 

      Button button91 = (Button) findViewById(R.id.dlc); 
      button91.setOnClickListener(new OnClickListener() {   
       public void onClick(View v) { 

        startActivity(new Intent(getApplicationContext(), DLC.class)); 
       } 
      }); 

      Button button96 = (Button) findViewById(R.id.help); 
      button96.setOnClickListener(new OnClickListener() {   
       public void onClick(View v) { 
        startActivity(new Intent(getApplicationContext(), Instruction.class));    
       } 
      }); 

      // this 
      String ns = Context.NOTIFICATION_SERVICE; 
      NotificationManager mNotificationManager = (NotificationManager) getSystemService(ns); 

      int icon = R.drawable.launcher;   
      CharSequence tickerText = "MinecraftPedia"; // ticker-text 
      long when = System.currentTimeMillis();   
      Context context = getApplicationContext();  
      CharSequence contentTitle = "MinePedia"; 
      CharSequence contentText = "This is the quick launch button for MinePedia";  
      Intent notificationIntent = new Intent(this, MainActivity.class); 
      PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0); 
      Notification notification = new Notification(icon, tickerText, when); 
      notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent); 

      // and this 
      final int HELLO_ID = 1; 
      mNotificationManager.notify(HELLO_ID, notification); 
      boolean installed = appInstalledOrNot("com.shadycorp"); 
      if(installed) 
      { 
      //set if action 
       setContentView(R.layout.winner_main); 
      } 
      else 
      { 
       //set else action 
       setContentView(R.layout.activity_main); 
      } 
     } 
     private boolean appInstalledOrNot(String uri) 
     { 
      PackageManager pm = getPackageManager(); 
      boolean app_installed = false; 
      try 
      { 
        pm.getPackageInfo(uri, PackageManager.GET_ACTIVITIES); 
        app_installed = true; 
      } 
      catch (PackageManager.NameNotFoundException e) 
      { 
        app_installed = false; 
      } 
      return app_installed ;    
    }    
} 

這裏是logcat的

04-15 12:01:07.529: E/AndroidRuntime(827): FATAL EXCEPTION: main 
04-15 12:01:07.529: E/AndroidRuntime(827): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.shadycorp.minecraftrecipebook/com.shadycorp.minecraftrecipebook.MainActivity}: java.lang.NullPointerException 
04-15 12:01:07.529: E/AndroidRuntime(827): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180) 
+0

請問是何意圖 – Shayden117

+1

調用findViewById()*之後* setContentView() – etienne

+0

同意@etienne – Rohit

回答

1

,你必須使用默認的佈局 線,第一條語句的時候就創建了一個名爲因爲你不能沒有佈局添加按鈕

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

}

    public void addButton(){ 

        Button button9 = (Button) findViewById(R.id.info); 
        button9.setOnClickListener(new OnClickListener() {   
         public void onClick(View v) { 
          startActivity(new Intent(getApplicationContext(),      

           AppInf.class)); 
         } 
        }); 

        Button button91 = (Button) findViewById(R.id.dlc); 
        button91.setOnClickListener(new OnClickListener() {   
         public void onClick(View v) { 

          startActivity(new Intent(getApplicationContext(),   

            DLC.class)); 
            } 
        }); 

        Button button96 = (Button) findViewById(R.id.help); 
        button96.setOnClickListener(new OnClickListener() {   
         public void onClick(View v) { 
          startActivity(new Intent(getApplicationContext(),     

         Instruction.class)); 
        } 
        }); 
        } 

現在調用這個方法不管你想要的和不忘記在兩個佈局中添加按鈕佈局定義。

+0

謝謝,但我不完全得到你的意見 – Shayden117

+0

現在你檢查應用程序的安裝方法和更改佈局... –

+0

我在說setContentView(R.layout.activity_main);用於創建然後做你的東西。你沒有使用setContentView(R.layout。activity_main)在oncreate方法和添加按鈕佈局,給出錯誤 –

3

這是因爲你是從調用你的按鈕(或任何其他UI組件)尚不存在的佈局。

您需要運行您的條件邏輯並在之前調用其佈局。請注意:由於它們是不同的佈局,因此它們可能不包含相同的組件,因此,當您決定要設置哪種佈局時,只需調用其中存在的組件即可,如果嘗試使用此組件,則只需調用其中的組件即可調用一個按鈕,它不會在當前佈局中聲明,並且會拋出異常。

+0

那麼我該怎麼做? – Shayden117

+0

在調用任何按鈕/組件之前,您應該移動您的條件邏輯來設置模板(我的意思是if-else塊)。如果您仍然有疑問,請粘貼您的模板結構以進一步幫助您。 – Areks

1

您應該根據包含獲取每個視圖的所有reference_ID佈局第一。

在嘗試使用ID查找視圖之前先設置此條件。

boolean installed = appInstalledOrNot("com.shadycorp"); 
      if(installed) 
      { 
      //set if action 
       setContentView(R.layout.winner_main); 
      } 
      else 
      { 
       //set else action 
       setContentView(R.layout.activity_main); 
      } 

據推測的,你必須保持一個Boolean這表明其layout存在形式既當您使用任何瀏覽來自兩個layout

相關問題