#java #android #xml #nullpointerexception #android-tablelayout
#java #Android #xml #исключение nullpointerexception #android-tablelayout
Вопрос:
Я пытаюсь добавить TableRow в TableLayout программно, но он продолжает выдавать мне NPE.
Это мой метод onCreate:
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();
}
try {
BufferedReader br = new BufferedReader(new InputStreamReader(openFileInput(MainActivity.FILE_SERVERS)));
TableLayout table = (TableLayout) findViewById(R.id.table_servers);
String line = null;
while ((line = br.readLine()) != null){
String[] values = line.split(",");
MCServer server = new MCServer(values[0], values[1], values[2], values[3], Boolean.parseBoolean(values[4]));
servers.add(server);
TableRow row = new TableRow(this);
TextView name = new TextView(this);
TextView ip = new TextView(this);
TextView interval = new TextView(this);
TextView status = new TextView(this);
name.setText(values[0]);
ip.setText(values[1] ":" values[2]);
interval.setText(values[3]);
status.setText("----");
row.addView(name);
row.addView(ip);
row.addView(interval);
row.addView(status);
table.addView(row);
}
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
Это мое fragment_main.xml:
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@ id/table_servers"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TableRow>
<TextView
android:layout_width="0dp"
android:layout_height="23dp"
android:layout_weight="1"
android:padding="3dip"
android:text="@string/servers_table_r1c1" />
<TextView
android:layout_width="0dp"
android:layout_height="23dp"
android:layout_weight="1"
android:padding="3dip"
android:text="@string/servers_table_r1c2" />
<TextView
android:layout_width="0dp"
android:layout_height="23dp"
android:layout_weight="0.6"
android:padding="3dip"
android:text="@string/servers_table_r1c3" />
<TextView
android:layout_width="0dp"
android:layout_height="23dp"
android:layout_weight="0.6"
android:padding="3dip"
android:text="@string/servers_table_r1c4" />
</TableRow>
<!-- This one is for testing purposes -->
<TableRow>
<TextView
android:text="@string/servers_table_r1c1"
android:padding="3dip" />
<TextView
android:text="@string/servers_table_r1c2"
android:padding="3dip" />
<TextView
android:text="@string/servers_table_r1c3"
android:padding="3dip" />
<TextView
android:text="@string/servers_table_r1c4"
android:padding="3dip" />
</TableRow>
</TableLayout>
Это дает мне NPE в этой строке:
table.addView(row);
Я не знаю, в чем проблема, как я могу это исправить?
Ответ №1:
Поскольку вы разместили эти представления в макете фрагмента, они не являются частью действия, пока фрагмент не будет на месте.
Короче говоря: переместите try...
код в фрагмент onCreateView()
. И вместо findViewById
, используйте rootView.findViewById()
, где rootView
это представление, которое возвращается методом.