findViewById 在 Fragment 而不是在 (On)CreateView
findViewById in Fragment and not in (On)CreateView
我有一个 Activity 并使用适配器填充网格。当按下网格中的项目时,我想更改 "NavbarFragment" 中 TextView 的文本。
CategoryActivity.java:
GridView grid = (GridView) findViewById(R.id.gridlayout_grid);
grid.setAdapter(new GridAdapter(tiles));
CategoryActivity.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="5dp"
android:orientation="vertical"
tools:context=".Activity.CategoryActivity">
<fragment android:name="app_a_tize.expressme.Fragment.NavbarFragment"
android:id="@+id/fragNavbar"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<GridView
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"
android:layout_margin="5dp"
android:verticalSpacing="10dp"
android:gravity="center"
android:horizontalSpacing="10dp"
android:layout_gravity="center"
android:id="@+id/gridlayout_grid"/>
<fragment android:name="app_a_tize.expressme.Fragment.ConversationbarFragment"
android:id="@+id/fragConversation"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
GridAdapter.java中的onClickListener:
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
TextView textView = (TextView) v.findViewById(R.id.item_name);
String tileName = textView.getText().toString();
System.out.println("tileName" + tileName);
ConversationBarManager.getInstance().addWord(tileName);
NavbarFragment navbar = new NavbarFragment();
navbar.changeConversationBarString();
}
});
NavbarFragment.java中的函数:
public void changeConversationBarString(){
TextView conversationBar = (TextView) ?????.findViewById(R.id.conversationBar);
conversationBar.setText(ConversationBarManager.getInstance().getConversationBarString());
}
在这个函数中^我想更改片段中TextView conversationBar 的文本。但我无法获得 TextView,因为无论我尝试什么,我都会得到一个 NullPointer。因为 findViewById 不起作用。
所有关于findViewById的问题都说可以使用:onCreateView()方法中的getView()。
我的问题是:当单击网格中的项目时,如何更改 NavbarFragment 中我的 TextView 的文本 属性。
您可能想要做的是更早地初始化 TextView
。在#onCreateView()
像这样:
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.my_fragment, container, false);
mMyTextView = (TextView) view.findViewById(R.id.my_text_view);
}
然后在您的 public 方法中:
public void changeConversationBarString(){
mMyTextView.setText(ConversationBarManager.getInstance().getConversationBarString());
}
最好的方法是使用 Butterknife
Butterknife 是一个强大的工具
在依赖项上:
compile 'com.jakewharton:butterknife:7.0.1'
以及您绑定的代码:
public class MainActivity extends ActionBarActivity {
private static final int TAB_REMOTE_POSITION = 0;
private static final int TAB_SOCIAL_POSITION = 1;
private RemoteFragment remoteFragment;
private ChatFragment chatFragment;
private BluetoothSPP bt;
private boolean bBluetooth = true;
private WiFiP2pService wiFiP2pService;
@Bind(R.id.view_pager)
ViewPager viewPager;
@Bind(R.id.tab_layout)
TabLayout tabLayout;
在你初始化的片段上(oncreate):
ButterKnife.bind(this, v);
activity:
ButterKnife.bind(this);
因为您没有使用 FragmentManager
将 Fragment 添加到布局中,所以不会调用 Fragment
的 onCreateView
方法。
由于无法立即附加片段,因此最好从片段的 onViewCreated
方法中调用 changeConversationBarString
。
在您的 activity 中确保附上您的片段:
FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.add(R.id.fragment_content, new NavbarFragment());
ft.commit();
在NavbarFragment
中:
public void onViewCreated() {
changeConversationBarString();
}
public void changeConversationBarString(){
TextView conversationBar = (TextView) getView().findViewById(R.id.conversationBar);
conversationBar.setText(ConversationBarManager.getInstance().getConversationBarString());
}
我有一个 Activity 并使用适配器填充网格。当按下网格中的项目时,我想更改 "NavbarFragment" 中 TextView 的文本。
CategoryActivity.java:
GridView grid = (GridView) findViewById(R.id.gridlayout_grid);
grid.setAdapter(new GridAdapter(tiles));
CategoryActivity.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="5dp"
android:orientation="vertical"
tools:context=".Activity.CategoryActivity">
<fragment android:name="app_a_tize.expressme.Fragment.NavbarFragment"
android:id="@+id/fragNavbar"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<GridView
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"
android:layout_margin="5dp"
android:verticalSpacing="10dp"
android:gravity="center"
android:horizontalSpacing="10dp"
android:layout_gravity="center"
android:id="@+id/gridlayout_grid"/>
<fragment android:name="app_a_tize.expressme.Fragment.ConversationbarFragment"
android:id="@+id/fragConversation"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
GridAdapter.java中的onClickListener:
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
TextView textView = (TextView) v.findViewById(R.id.item_name);
String tileName = textView.getText().toString();
System.out.println("tileName" + tileName);
ConversationBarManager.getInstance().addWord(tileName);
NavbarFragment navbar = new NavbarFragment();
navbar.changeConversationBarString();
}
});
NavbarFragment.java中的函数:
public void changeConversationBarString(){
TextView conversationBar = (TextView) ?????.findViewById(R.id.conversationBar);
conversationBar.setText(ConversationBarManager.getInstance().getConversationBarString());
}
在这个函数中^我想更改片段中TextView conversationBar 的文本。但我无法获得 TextView,因为无论我尝试什么,我都会得到一个 NullPointer。因为 findViewById 不起作用。
所有关于findViewById的问题都说可以使用:onCreateView()方法中的getView()。
我的问题是:当单击网格中的项目时,如何更改 NavbarFragment 中我的 TextView 的文本 属性。
您可能想要做的是更早地初始化 TextView
。在#onCreateView()
像这样:
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.my_fragment, container, false);
mMyTextView = (TextView) view.findViewById(R.id.my_text_view);
}
然后在您的 public 方法中:
public void changeConversationBarString(){
mMyTextView.setText(ConversationBarManager.getInstance().getConversationBarString());
}
最好的方法是使用 Butterknife Butterknife 是一个强大的工具
在依赖项上:
compile 'com.jakewharton:butterknife:7.0.1'
以及您绑定的代码:
public class MainActivity extends ActionBarActivity {
private static final int TAB_REMOTE_POSITION = 0;
private static final int TAB_SOCIAL_POSITION = 1;
private RemoteFragment remoteFragment;
private ChatFragment chatFragment;
private BluetoothSPP bt;
private boolean bBluetooth = true;
private WiFiP2pService wiFiP2pService;
@Bind(R.id.view_pager)
ViewPager viewPager;
@Bind(R.id.tab_layout)
TabLayout tabLayout;
在你初始化的片段上(oncreate):
ButterKnife.bind(this, v);
activity:
ButterKnife.bind(this);
因为您没有使用 FragmentManager
将 Fragment 添加到布局中,所以不会调用 Fragment
的 onCreateView
方法。
由于无法立即附加片段,因此最好从片段的 onViewCreated
方法中调用 changeConversationBarString
。
在您的 activity 中确保附上您的片段:
FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.add(R.id.fragment_content, new NavbarFragment());
ft.commit();
在NavbarFragment
中:
public void onViewCreated() {
changeConversationBarString();
}
public void changeConversationBarString(){
TextView conversationBar = (TextView) getView().findViewById(R.id.conversationBar);
conversationBar.setText(ConversationBarManager.getInstance().getConversationBarString());
}