2011-03-08 27 views
0

我正在創建一個自定義/擴展的LinearLayout,我將其添加到ViewAnimator顯然是爲了很酷的效果。android擴展LinearLayout,添加XML與LayoutInflater,findViewById爲空

所以我的主要活動有一個ViewAnimator,我創建了這個NavigationView的一個實例,我一直在努力並將它作爲子視圖添加到ViewAnimator中。 NavigationView本身使用LayoutInflater來獲取我製作的界面的xml並將其附加到自己。

然後我嘗試找到這個微調,我知道有正確的ID,它總是返回null。如果我使用這個XML作爲Activity的主要內容視圖,那麼找到Spinner就沒有問題。

這裏是我的代碼:

public class NavigationView extends LinearLayout { 

    public NavigationView(Context context) { 
     super(context); 
     addView(context); 
    } 

    public NavigationView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     addView(context); 
    } 

    public void addView(Context context) { 

     LayoutInflater inflater = LayoutInflater.from(context); 
     View v = inflater.inflate(R.layout.nav, this, true); 

     Spinner spinner = (Spinner) findViewById(R.id.nav_spinner); 
     if(spinner == null) Log.v("spinner", "null"); 

    } 
    } 

所以我總是看到 「微調」 作爲logcat的 「空」。

我看到我創建的界面添加到屏幕上,但它驅使我堅持爲什麼它不會通過id找到這個對象。

難道是因爲它誇大了它不能正確分配ID嗎?

回答

0

你需要在你膨脹的視圖上調用findViewById。所以這意味着你需要試試這個:

Spinner spinner = (Spinner) v.findViewById(R.id.nav_spinner); 
+0

我試過,但它也返回null。所以做以下事情:活動a =(活動)上下文; Spinner spinner =(Spinner)a.findViewById(R.id.nav_spinner); – Paul 2011-03-08 23:03:39

+0

嗯,在這種情況下,嘗試將nav_spinner重命名爲不同的id名稱,我似乎記得在xml佈局中爲小部件設置了下劃線會導致Android有趣的效果....一旦您將它重命名爲id沒有下劃線嘗試我在答案中提到的內容。 – 2011-03-08 23:06:55

+0

我拿出下劃線但沒有成功。 – Paul 2011-03-08 23:12:04

1

你正在充氣你在錯誤的時間查看。刪除addView方法,重寫onFinishInflate()方法並在此執行通貨膨脹。例如

@Override 
    protected void onFinishInflate() { 
      super.onFinishInflate(); 
      ((Activity)getContext()).getLayoutInflater().inflate(R.layout.nav, this); 

      Spinner spinner = (Spinner) findViewById(R.id.nav_spinner); 
      if(spinner == null) Log.v("spinner", "null"); 
    } 
+0

我有一些代碼在主要活動,它執行以下操作:NavigationView navView = new NavigationView(this); viewSwap.addView(navView);我在NavigationView的onFinishInflate()中添加了一個Log.v(...),但我在LogCat – Paul 2011-03-08 23:28:35

+0

沒有看到它,對不起,我沒有注意到你沒有從XML擴充這個視圖。您需要在調用addView()的地方手動調用此方法。如果這不起作用,那麼您的某個ID有問題 – longhairedsi 2011-03-08 23:32:34

1

所以不知道爲什麼,給一些好的建議,並與我最終得到的代碼周圍的玩弄它的工作:

public class NavigationView extends LinearLayout { 

    public NavigationView(Context context) { 

     super(context); 
     this.init(context); 

    } 

    public void init(Context context) { 

     LayoutInflater inflater = LayoutInflater.from(context); 
     View v = inflater.inflate(R.layout.nav, this, true); 

     Spinner spinner = (Spinner) v.findViewById(R.id.navSpinner); 
     if(spinner != null) { 

      ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(context, R.array.nav_sections, android.R.layout.simple_spinner_item); 
      adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
      spinner.setAdapter(adapter); 
     } 

    } 

} 

這似乎是完全相同的代碼,也許我只是我拿出下劃線後需要清理我的項目?