【问题标题】:Tabbed Activity - Fragments [duplicate]选项卡式活动 - 片段 [重复]
【发布时间】:2017-09-12 20:12:41
【问题描述】:

我想创建一个带有选项卡的“选项卡式活动”以进行用户友好的布局。我已经将活动设置为使用 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

我做错了什么?

【问题讨论】:

  • java paclahe 中的第二个按钮,new/Fragment。您可以使用从图库中选择的 TabbedActivity 中的代码来指导您自己。在那个 Activity 里面有一个 PagerAdapter,你可以在那里添加你的 Fragments。

标签: android android-fragments nullpointerexception


【解决方案1】:

你隐藏了你的 EditText 字段

替换

EditText chatText = (EditText) root.findViewById

this.chatText = (EditText) root.findViewById

仅供参考,标签式活动并未被弃用

【讨论】:

  • 首先,非常感谢:它成功了!!!!!!!!!
  • 第三。为什么我没有将 (this) 添加到 Button send = (Button) root.findViewById(R.id.btn); ListView list = (ListView) root.findViewById (R.id.listview); ???
  • 第一。随意使用帖子旁边的复选标记接受此答案以接受它。三、看private EditText chatText;。没有私有 Button 或 ListView。 -- stackoverflow.com/questions/26297180/…
猜你喜欢
  • 1970-01-01
  • 2017-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多