为什么通过id找不到onCreate的视图?

时间:2014-05-30 05:52:55

标签: android android-layout

我一直在查看许多在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" />

3 个答案:

答案 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我在此处提出的相关问题及其更多示例。