我一直在尝试将文本设置为片段中的textviews。我尝试没有适配器,但现在我尝试使用适配器。此时它崩溃并在下一行FragmentManager fm = ((NieuwToevoegen)context).getFragmentManager();
上给我一个NullPointerException,但我很确定这不是唯一的问题。在我的应用程序中,我想根据您的输入放置不同的frameLayouts。并且根据frameLayouts的数量,我为textviews获得了不同的字符串。这是我第一次使用碎片。
如果有人知道更好的方法,请告诉我。
我的活动
public class NieuwToevoegen extends AppCompatActivity {
Button buttonVerstuur;
FragmentManager fm = getFragmentManager();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.nieuw_toevoegen);
buttonVerstuur = (Button) findViewById(R.id.buttonVerstuur);
buttonVerstuur.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
TextView aantalTxt = (TextView) findViewById(R.id.txtAantal);
aantalTxt.setEnabled(false);
int aantal = Integer.parseInt(aantalTxt.getText() + "");
Log.d("onclickButtonVerstuur", aantal + "");
tekstFragmentAdapter adapter = new tekstFragmentAdapter(NieuwToevoegen.this,aantal);
}});}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
// Respond to the action bar's Up/Home button
case android.R.id.home:
goBack();
return true;
}
return super.onOptionsItemSelected(item);
}
private void goBack(){
super.onBackPressed();
Intent i = new Intent(NieuwToevoegen.this, startScherm.class);
Log.d("backbutton", i + "");
startActivity(i);
}
@Override
public void onBackPressed() {
goBack();
}
public void addFragment(int id) {
FragmentTransaction ft = fm.beginTransaction();
ft.add(id, new fragmentItem());
Log.d("addfragment", ft+"");
ft.commit();
}
我的适配器
public class tekstFragmentAdapter extends ArrayAdapter<tekstFragment> {
private Context context;
private Integer aantal;
public tekstFragmentAdapter(Context context, int aantalFr) {
super(context, 0, aantalFr);
aantal=aantalFr;
}
FragmentManager fm = ((NieuwToevoegen)context).getFragmentManager();
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = LayoutInflater.from(getContext()).inflate(R.layout.fragment_item_layout, parent, false);
}
TextView tekst1 = (TextView) convertView.findViewById(R.id.textView1);
TextView tekst2 = (TextView) convertView.findViewById(R.id.textView2);
TextView tekst3 = (TextView) convertView.findViewById(R.id.textView3);
switch(aantal) {
case 1:
tekst1.setText("@string/een_item1_string");
addFragment(R.id.frameLayout1);
break;
case 2:
tekst1.setText("@string/twee_item1_string");
tekst2.setText("@string/twee_item2_string");
addFragment(R.id.frameLayout1);
addFragment(R.id.frameLayout2);
break;
case 3:
tekst1.setText("@string/drie_item1_string");
tekst2.setText("@string/drie_item2_string");
tekst3.setText("@string/drie_item3_string");
addFragment(R.id.frameLayout1);
addFragment(R.id.frameLayout2);
addFragment(R.id.frameLayout3);
break;
default:
TextView aantalIngevuld = (TextView) convertView.findViewById(R.id.txtAantal);
aantalIngevuld.setEnabled(true);
break;}
return convertView;
}
public void addFragment(int id) {
FragmentTransaction ft = fm.beginTransaction();
ft.add(id, new fragmentItem());
Log.d("addfragment", ft + "");
ft.commit();
}
}
片段xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="fill_parent">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="100dp"
android:gravity="center_horizontal"
android:layout_margin="20dp"
android:id="@+id/frameLayout1">
<ImageButton
android:layout_width="120dp"
android:layout_height="100dp"
android:scaleType="fitXY"
android:id="@+id/imageButton1"
android:layout_gravity="center_horizontal"
android:src="@drawable/gallery_icon"
android:background="#00000000"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
android:id="@+id/textView1" />
</FrameLayout>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="100dp"
android:gravity="center_horizontal"
android:layout_margin="20dp"
android:id="@+id/frameLayout2">
<ImageButton
android:layout_width="120dp"
android:layout_height="100dp"
android:scaleType="fitXY"
android:id="@+id/imageButton2"
android:layout_gravity="center_horizontal"
android:src="@drawable/gallery_icon"
android:background="#00000000" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
android:id="@+id/textView2" />
</FrameLayout>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="100dp"
android:gravity="center_horizontal"
android:layout_margin="20dp"
android:id="@+id/frameLayout3">
<ImageButton
android:layout_width="120dp"
android:layout_height="100dp"
android:scaleType="fitXY"
android:id="@+id/imageButton3"
android:layout_gravity="center_horizontal"
android:src="@drawable/gallery_icon"
android:background="#00000000" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
android:id="@+id/textView3" />
</FrameLayout>
</LinearLayout>
tekstFragment仅包含以下内容
public class tekstFragment {
private String tekst;
public tekstFragment( String tekst) {
this.tekst = tekst;
}
public String getTekst() {
return tekst;
}
}
我想添加的字符串
<string name="drie_item1_string">Voeg een foto toe van een pull/sweater/jas</string>
<string name="drie_item2_string">Voeg een foto toe van een t-shirt/top</string>
<string name="drie_item3_string">Voeg een foto toe van een rok/short/broek</string>
<string name="twee_item1_string">Voeg een foto toe van een pull/sweater/jas</string>
<string name="twee_item2_string">Voeg een foto toe van een kleedje/broekpak/playsuit</string>
<string name="een_item1_string">Voeg een foto toe van een kleedje/broekpak/playsuit</string>
答案 0 :(得分:1)
纠正空指针异常问题
public class tekstFragmentAdapter extends ArrayAdapter<tekstFragment> {
private Context context;
private Integer aantal;
FragmentManager fm;
public tekstFragmentAdapter(Context context, int aantalFr) {
super(context, 0, aantalFr);
aantal=aantalFr;
this.context= context
fm = ((NieuwToevoegen)context).getFragmentManager();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = LayoutInflater.from(getContext()).inflate(R.layout.fragment_item_layout, parent, false);
}
TextView tekst1 = (TextView) convertView.findViewById(R.id.textView1);
TextView tekst2 = (TextView) convertView.findViewById(R.id.textView2);
TextView tekst3 = (TextView) convertView.findViewById(R.id.textView3);
switch(aantal) {
case 1:
tekst1.setText("@string/een_item1_string");
addFragment(R.id.frameLayout1);
break;
case 2:
tekst1.setText("@string/twee_item1_string");
tekst2.setText("@string/twee_item2_string");
addFragment(R.id.frameLayout1);
addFragment(R.id.frameLayout2);
break;
case 3:
tekst1.setText("@string/drie_item1_string");
tekst2.setText("@string/drie_item2_string");
tekst3.setText("@string/drie_item3_string");
addFragment(R.id.frameLayout1);
addFragment(R.id.frameLayout2);
addFragment(R.id.frameLayout3);
break;
default:
TextView aantalIngevuld = (TextView) convertView.findViewById(R.id.txtAantal);
aantalIngevuld.setEnabled(true);
break;}
return convertView;
}
public void addFragment(int id) {
FragmentTransaction ft = fm.beginTransaction();
ft.add(id, new fragmentItem());
Log.d("addfragment", ft + "");
ft.commit();
}
}
但为什么要使用Activtiy NieuwToevoegen 来构建上下文,只需将上下文作为参数添加到适配器
答案 1 :(得分:1)
我更喜欢发布另一个答案,因为它不会与第一个答案相关,我会根据您的需要提出结构代码并继续:
package my.game.androidstarter;
import android.R;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
public class NieuwToevoegen extends Activity {
Button buttonVerstuur;
EditText editTextInput; // so user could insert a text from 1 to 3
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.nieuw_toevoegen);
buttonVerstuur = (Button) findViewById(R.id.buttonVerstuur);
editTextInput = (EditText) findViewById(R.id.yourEditText); // add your edit text in your xml layout "nieuw_toevoegen"
editTextInput.setEnabled(false);
buttonVerstuur.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int aantal = Integer.parseInt(editTextInput.getText().toString()); // get the number input inserted by user
Log.d("onclickButtonVerstuur", aantal + "");
callFragment(aantal);
}});}
private void callFragment(int aantal) {
switch (aantal) {
case 1:
YourCustomFragment1 fragment = new YourCustomFragment1(); // if 1 --> your custom fragment one
break;
case 2:
YourCustomFragment2 fragment = new YourCustomFragment2(); // if 2 --> your custom fragment two
break;
case 3:
YourCustomFragment3 fragment = new YourCustomFragment3(); // if 2 --> your custom fragment three
break;
default:
// TODO if user insert a number that is not 1 or 2 or 3 (and he can do thant)
break;
}
// charge the fragment that was created depending on input number
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.frame_container, fragment).commit(); // You should have frame_container (frame layout) defined in your nieuw_toevoegen.xml
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
// Respond to the action bar's Up/Home button
case android.R.id.home:
goBack();
return true;
}
return super.onOptionsItemSelected(item);
}
private void goBack(){
super.onBackPressed();
Intent i = new Intent(NieuwToevoegen.this, startScherm.class);
Log.d("backbutton", i + "");
startActivity(i);
}
@Override
public void onBackPressed() {
goBack();
}
现在你所要做的就是创建三个不同的cutom片段(扩展 Fragment
的类),然后以布局,视图,按钮,图像等方式自定义每个片段...
希望这很清楚!