2014-04-01 156 views
1

我剛剛開始使用eclipse玩Android。我已經在這個問題上停頓了一段時間了,我不知道爲什麼它不起作用。R.id返回false

我已經開始用做盡可能只是爲了看看問題是否仍然存在少編碼一個新的應用程序。基本上,當我輸入'R.id.'時它會爲我提供可能的id的正確列表,但當我嘗試運行它們時,它將返回false。

目前一個我測試有一個非常簡單的XML,其中ID之一是「文」。所以當我輸入R.id時,它會提示我選項,其中一個是文本。所以我寫R.id.text期待它返回id。此外,當findViewById(R.id.text)它崩潰應用程序與該行上的空指針異常。

fragment_main.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/base" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context="com.reecemerrett.historical.MainActivity$PlaceholderFragment" > 

    <TextView 
     android:id="@+id/text" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/hello_world" /> 

</RelativeLayout> 

MainActivity.java:

import android.support.v7.app.ActionBarActivity; 
import android.support.v7.app.ActionBar; 
import android.support.v4.app.Fragment; 
import android.app.AlertDialog; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.ViewGroup; 
import android.os.Build; 

public class MainActivity extends ActionBarActivity { 

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

     if (savedInstanceState == null) { 
      getSupportFragmentManager().beginTransaction() 
        .add(R.id.container, new PlaceholderFragment()).commit(); 
     } 

     new AlertDialog.Builder(this) 
     .setTitle("ID") 
     .setMessage(R.id.text) 
     .show(); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 

     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 
     if (id == R.id.action_settings) { 
      return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 

    /** 
    * A placeholder fragment containing a simple view. 
    */ 
    public static class PlaceholderFragment extends Fragment { 

     public PlaceholderFragment() { 
     } 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
       Bundle savedInstanceState) { 
      View rootView = inflater.inflate(R.layout.fragment_main, container, 
        false); 
      return rootView; 
     } 
    } 

} 

該代碼輸出假。我已經用很多不同的ID來嘗試它,甚至用R.id.container。

我也試着刪除整個片段式的,並直接與調用的setContentView fragment_main.xml()。

任何幫助,非常感謝。

回答

0

TextView屬於片段佈局即fragment_main.xml

因此改變

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.fragment_main, container, 
       false); 
     TextView tv = (TextView) rootView.findViewByid(R.id.text); 
     new AlertDialog.Builder(getActivity()) 
     .setTitle("ID") 
     .setMessage(tv.getText().toString()) 
     .show(); 
     return rootView; 
    } 

或者

正如你已經嘗試過

我也試着刪除整個片段式的,並直接與setContentView()調用fragment_main.xml

這將工作。確保你得到像

public class MainActivity extends ActionBarActivity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.fragment_main); 
    TextView tv = (TextView)findViewByid(R.id.text); 
    new AlertDialog.Builder(this) 
    .setTitle("ID") 
    .setMessage(tv.getText().toString()) 
    .show(); 
} 
} 
+0

將fragment_main直接放入setContentView()中是正確的。當我在輸出R.id.text之前進行測試時,無論哪種方式評估都是錯誤的。所以我可能在之前修好了它,但看到這個錯誤,並認爲它仍然是壞的。所以我輸出tv.getText()像你一樣,然後我得到一個有效的輸出。無論如何,非常感謝你讓我再次去看看。 – user3484254

0

擺脫片段相關的代碼試試這個..

刪除AlertDialog.BuilderMainActivity把這些代碼在PlaceholderFragment像下面

public static class PlaceholderFragment extends Fragment { 

    public PlaceholderFragment() { 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.fragment_main, container, 
       false); 

     new AlertDialog.Builder(getActivity()) 
     .setTitle("ID") 
     .setMessage(((TextView) rootView.findViewById(R.id.text)).getText().toString().trim()) 
     .show(); 

     return rootView; 
    } 
} 
0

我之前遇到過類似的問題。由於您的視圖位於您的片段內,因此findViewByID不會爲您找到它。爲什麼?我不知道!!但它不應該是一個問題,因爲你可以在片段的onCreateView回調中找到這個視圖。假設你的看法是一個TextView的代碼看起來像這樣

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.fragment_content_view, container, false); 
    TextView viewText = (TextView) view.findViewById(R.id.text); 
    return view; 
} 

通常這會解決問題,因爲活動並不需要了解內部片段的看法。片段應該自己處理他們的事情,只在必要時與活動交談。但是,您的活動仍然可以使用「片段活動 - 活動分段通信技術」訪問此數據。我不會解釋它們,因爲在developer.android.com上有非常好的文檔。