我想创建一个" Tabbed Activity"带有标签,使用户友好的布局。我已经将活动设置为使用PagerAdapter
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
toolbar.setTitleTextColor(Color.BLUE);
toolbar.setSubtitleTextColor(Color.BLUE);
TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout);
tabLayout.addTab(tabLayout.newTab().setText("Chat"));
tabLayout.addTab(tabLayout.newTab().setText("Appunti"));
tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
tabLayout.setBackgroundColor(getResources().getColor(R.color.color_yahweh));
final ViewPager viewPager = (ViewPager) findViewById(R.id.pager);
final PagerAdapter adapter = new PagerAdapter
(getSupportFragmentManager(), tabLayout.getTabCount());
viewPager.setAdapter(adapter);
viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener()
{
@Override
public void onTabSelected(TabLayout.Tab tab) {
viewPager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
}
}
然后是PagerAdapter
public class PagerAdapter extends FragmentStatePagerAdapter {
int mNumOfTabs;
public PagerAdapter(FragmentManager fm, int NumOfTabs) {
super(fm);
this.mNumOfTabs = NumOfTabs;
}
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
TabFragment1 tab1 = new TabFragment1();
return tab1;
case 1:
TabFragment2 tab2 = new TabFragment2();
return tab2;
default:
return null;
}
}
@Override
public int getCount() {
return mNumOfTabs;
}
}
最后,TabFragment1代码
public class TabFragment1 extends Fragment {
private static final String TAG = "ChatActivity";
private ChatArrayAdapter adp;
private ListView list;
private EditText chatText;
private Button send;
Intent intent;
private boolean side = false;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.tab_fragment_1, container, false);
}
public void onCreate (Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent i = getIntent();
setContentView(R.layout.tab_fragment_1);
send = (Button) findViewById(R.id.btn);
list = (ListView) findViewById(R.id.listview);
adp = new ChatArrayAdapter(getApplicationContext(), R.layout.chat);
list.setAdapter(adp);
chatText = (EditText) findViewById(R.id.chat_text);
chatText.setOnKeyListener(new OnKeyListener() {
public boolean onKey(View v, int keyCode, KeyEvent event) {
if ((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER)) {
return sendChatMessage();
}
return false;
}
});
send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
sendChatMessage();
}
});
list.setTranscriptMode(AbsListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);
list.setAdapter(adp);
adp.registerDataSetObserver(new DataSetObserver() {
public void OnChanged(){
super.onChanged();
list.setSelection(adp.getCount() -1);
}
});
}
private boolean sendChatMessage(){
adp.add(new ChatMessage(side, chatText.getText().toString()));
chatText.setText("");
side = !side;
return true;
}
}
}
和tab_fragment_1 XML
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
>
<ListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="80dp"
/>
<EditText
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:inputType="textMultiLine"
android:ems="10"
android:id="@+id/chat_text"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_toLeftOf="@+id/btn"
/>
<Button
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="@string/button_send"
android:id="@+id/btn"
android:layout_alignBottom="@+id/chat_text"
android:layout_alignParentRight="true"
/>
</RelativeLayout>
我在TabFragment1.java上遇到很多错误,所以我想知道我做错了什么。然后我发现getIntent(),setContentView,findViewById,getApplicationContext()都与Activity相关,并且无法从Fragment中调用。所以我试图改变我的TabFragment1.java。现在它看起来像这样
public class TabFragment1 extends Fragment {
private ChatArrayAdapter adp;
private EditText chatText;
private boolean side = false;
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View root = inflater.inflate(R.layout.tab_fragment_1, container, false);
EditText chatText = (EditText) root.findViewById(R.id.chat_text);
Button send = (Button) root.findViewById(R.id.btn);
ListView list = (ListView) root.findViewById (R.id.listview);
list.setAdapter(adp);
adp = new ChatArrayAdapter(getActivity(), R.layout.chat);
list.setAdapter(adp);
chatText.setOnKeyListener(new OnKeyListener() {
public boolean onKey(View v, int keyCode, KeyEvent event) {
if ((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER)) {
return sendChatMessage();
}
return false;
}
});
send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
sendChatMessage();
}
});
list.setTranscriptMode(AbsListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);
list.setAdapter(adp);
adp.registerDataSetObserver(new DataSetObserver() {
});
return root;
}
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
private boolean sendChatMessage(){
adp.add(new ChatMessage(side, chatText.getText().toString()));
chatText.setText("");
side = !side;
return true;
}
}
当我尝试在我的应用上发送消息时,我仍然收到错误消息。它说:
java.lang.NullPointerException: Attempt to invoke virtual method 'android.text.Editable android.widget.EditText.getText()' on a null object reference
我做得不好?
答案 0 :(得分:0)
您隐藏了EditText字段
替换
EditText chatText = (EditText) root.findViewById
使用
this.chatText = (EditText) root.findViewById
fyi,标签活动不被弃用