我一直在查看许多在onCreate函数中获取显示指针的示例,但每次执行此操作时,我都会从findViewById函数返回null,但如果我在其他地方执行此操作就可以了。为了让这个工作正常,我错过了什么? 谢谢你的任何帮助,我必须遗漏一些东西
EditText messageField;
AutoCompleteTextView numberField;
EditText countField;
TextView messageDisplay;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
sms = SmsManager.getDefault();
preferences = PreferenceManager.getDefaultSharedPreferences(this);
messageField = (EditText) findViewById(R.id.message);
numberField = (AutoCompleteTextView) findViewById(R.id.number);
countField = (EditText) findViewById(R.id.count);
messageDisplay = (TextView) findViewById(R.id.display_message);
if (savedInstanceState == null) {
getFragmentManager().beginTransaction()
.add(R.id.container, new PlaceholderFragment()).commit();
}
}
fragment_main.xml
<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:background="#000000"
tools:context="com.example.last.MainActivity$PlaceholderFragment" >
<AutoCompleteTextView
android:id="@+id/number"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignRight="@+id/send"
android:layout_marginTop="49dp"
android:textColor="@android:color/white"
android:inputType="numberSigned"
android:selectAllOnFocus="true"
android:ems="10"
android:text="@string/phone_number" >
<requestFocus />
</AutoCompleteTextView>
<Button
android:id="@+id/send"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_below="@+id/message"
android:layout_marginRight="25dp"
android:layout_marginTop="70dp"
android:onClick="sendMessage"
android:textColor="@android:color/white"
android:text="@string/send_button" />
<EditText
android:id="@+id/message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignRight="@+id/send"
android:layout_below="@+id/number"
android:layout_marginTop="61dp"
android:ems="10"
android:inputType="textMultiLine"
android:textColor="@android:color/white"
android:selectAllOnFocus="true"
android:text="@string/default_message" />
<EditText
android:id="@+id/count"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/message"
android:layout_marginTop="32dp"
android:ems="4"
android:maxEms="4"
android:inputType="numberSigned"
android:textColor="@android:color/white"
android:text="@string/default_count" />
<ProgressBar
android:id="@+id/progressBar1"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/message"
android:layout_below="@+id/send" />
<TextView
android:id="@+id/display_message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/progressBar1"
android:layout_below="@+id/progressBar1"
android:layout_marginTop="45dp"
android:layout_toLeftOf="@+id/send"
android:textColor="@android:color/white"
android:text="@string/default_display_message" />
<TextView
android:id="@+id/char_count"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/message"
android:layout_alignBottom="@+id/message"
android:layout_alignParentRight="true"
android:text="18/160" />
<android.gesture.GestureOverlayView
android:id="@+id/easter_egg_gesture"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:layout_below="@+id/display_message" >
</android.gesture.GestureOverlayView>
<Button
android:id="@+id/eeb"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/easter_egg_gesture"
android:layout_alignParentLeft="true"
android:background="#000000"
android:onClick="easterEgg" />
activity_main.xml中
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.app.joebot.MainActivity"
tools:ignore="MergeRootFrame" />
答案 0 :(得分:0)
在您的代码中,看起来像EdiText和TextView这样的组件驻留在Fragment_main.xml中,但您在Activity_main.xml中引用它们。
将组件的初始化更改为正确的布局。
答案 1 :(得分:0)
问题在于以下四行代码:
messageField = (EditText) findViewById(R.id.message);
numberField = (AutoCompleteTextView) findViewById(R.id.number);
countField = (EditText) findViewById(R.id.count);
messageDisplay = (TextView) findViewById(R.id.display_message);
这些行应该 AFTER 你的片段事务:
if (savedInstanceState == null) {
getFragmentManager().beginTransaction()
.add(R.id.container, new PlaceholderFragment()).commit();
getFragmentManager().executePendingTransactions();
}
messageField = (EditText) findViewById(R.id.message);
numberField = (AutoCompleteTextView) findViewById(R.id.number);
countField = (EditText) findViewById(R.id.count);
messageDisplay = (TextView) findViewById(R.id.display_message);
这应该有效。另请注意,我已将executePendingTransactions()
方法添加到您的代码中(在本例中是必需的)。但是,我更愿意处理View
中的Fragment
个(除非有充分的理由在Activity
本身中使用它们)。从onCreate()
的{{1}}方法中删除这些行,并将其添加到Activity
的{{1}}方法中:
onViewCreated()
无论你想用这些PlaceholderFragment
做什么都可以用这种方法完成。希望这有助于...:)
答案 2 :(得分:0)
您正尝试从“活动”中引用片段布局中的“视图”。这是不可能的,因为视图位于片段的布局中,而不是活动的位置,它是它试图查看的位置。您应该在它们所在的片段中定义这些视图,然后如果您希望从您的Activity访问,则通过方法公开它们。
但是,您应该不要轻易做出这个决定,因为建议在片段中保留Fragment细节,并且只暴露您需要的内容。比如结果或值而不是整个视图。
public MyFragment extends Fragment implements View.OnClickListener
{
private Button myButton;
private EditText myEditText;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
View view = inflater.inflate(R.layout.fragment_input_submit, container, false);
myButton = (Button) view.findViewById(R.id.myButton);
myEditText = (EditText) view.findViewById(R.id.myEditText);
myButton.setOnClickListener(this);
return view;
}
@Override
public void onClick(View v)
{
// keep the Fragment interaction in the Fragment
switch (v.getId())
{
case R.id.myButton:
Log.v("example fragment", "myButton was pressed");
break;
default:
break;
}
}
public EditText getMyEditText()
{
// you could get the EditText to use in your Activity
return this.myEditText;
}
public String getEditTextContents()
{
// or you could just allow access the data
return this.myEditText.getText().toString();
}
}
要使用此功能,您需要在活动中保留对Fragment的引用:
public MyActivity extends FragmentActivity
{
private MyFragment myFragment;
@Override
public void onCreate(Bundle bundle)
{
super.onCreate(bundle);
setContentView(R.layout.activity_main);
myFragment = new MyFragment();
getFragmentManager().beginTransaction()
.add(R.id.container, myFragment).commit();
}
...
}
然后,要访问Fragment的信息,您可以调用:
EditText myEditText = myFragment.getMyEditText();
or
String editTextContents = myFragment.getEditTextContents();
取决于您的选择。
您还可以使用界面从片段到活动进行通信。有关详细信息,请参阅this previous answer我在此处提出的相关问题及其更多示例。