Урок 10. Оптимизируем реализацию обработчиков.
Re: Урок 10. Оптимизируем реализацию обработчиков.
del
Последний раз редактировалось Leeroy 30 апр 2026, 17:00, всего редактировалось 1 раз.
Re: Урок 10. Оптимизируем реализацию обработчиков.
В кнопке "onClickStart", а в методе "onClick". Ну, а если бы лог предоставили, тогда было б легче определить где ошибка.Vikky_Leto писал(а):Добрый день!
Приложение вылетает. Может кто-то посмотреть в чем ошибка?
Хотя, по логике, вроде все верно.
Manifest:MainActivity:Код: Выделить всё
[syntax=java]<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="ru.startandroid.p0103" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="10" android:targetSdkVersion="10" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="ru.startandroid.p0103.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>[/syntax]Fragment_main.xml:Код: Выделить всё
[syntax=java] package ru.startandroid.p0103; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v7.app.ActionBarActivity; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.Button; import android.widget.TextView; public class MainActivity extends ActionBarActivity implements OnClickListener{ Button btnStart; TextView tvOut; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //btnStart = (Button) findViewById(R.id.btnStart); //tvOut = (TextView) findViewById(R.id.tvOut); if (savedInstanceState == null) { getSupportFragmentManager().beginTransaction() .add(R.id.container, new PlaceholderFragment()).commit(); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } /** * A placeholder fragment containing a simple view. */ public static class PlaceholderFragment extends Fragment { public PlaceholderFragment() { } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_main, container, false); return rootView; } } @Override public void onClick(View arg0) { tvOut.setText("Нажата кнопка"); } } [/syntax]Код: Выделить всё
[syntax=java] <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/LinearLayout1" 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" tools:context="ru.startandroid.p0103.MainActivity$PlaceholderFragment" > <Button android:id="@+id/btnStart" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginTop="100dp" android:text="start" android:onClick="onClickStart"/> <TextView android:id="@+id/tvOut" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:text="TextView" /> </LinearLayout> [/syntax]
Re: Урок 10. Оптимизируем реализацию обработчиков.
del
Последний раз редактировалось Leeroy 30 апр 2026, 17:00, всего редактировалось 1 раз.
-
Vikky_Leto
- Сообщения: 4
- Зарегистрирован: 12 апр 2014, 22:05
Re: Урок 10. Оптимизируем реализацию обработчиков.
Благодарю всех за ответы. Исправила ошибки, но приложение по прежнему вылетает
MainActivity:
fragment_main
Manifest:
+ Log:
MainActivity:
Код: Выделить всё
[syntax=java]
package ru.startandroid.p0101_listener_beta01;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v7.app.ActionBarActivity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends ActionBarActivity {
TextView tvOut;
Button btnOk;
Button btnCancel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvOut = (TextView) findViewById(R.id.tvOut);
btnOk = (Button) findViewById(R.id.btnOk);
btnCancel = (Button) findViewById(R.id.btnCancel);
OnClickListener oclBtn = new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
// по id определеяем кнопку, вызвавшую этот обработчик
switch (v.getId()) {
case R.id.btnOk:
// кнопка ОК
tvOut.setText("Нажата кнопка ОК");
break;
case R.id.btnCancel:
// кнопка Cancel
tvOut.setText("Нажата кнопка Cancel");
break;
}
}
};
btnOk.setOnClickListener(oclBtn);
btnCancel.setOnClickListener(oclBtn);
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.add(R.id.container, new PlaceholderFragment()).commit();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
/**
* A placeholder fragment containing a simple view.
*/
public static class PlaceholderFragment extends Fragment {
public PlaceholderFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, container,
false);
return rootView;
}
}
}
[/syntax]Код: Выделить всё
[syntax=java]
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/LinearLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="ru.startandroid.p0101_listener_beta01.MainActivity$PlaceholderFragment" >
<LinearLayout
android:id="@+id/linearLayout1"
android:layout_height="match_parent"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_margin="30dp" >
<TextView
android:layout_width="wrap_content"
android:text="TextView"
android:layout_height="wrap_content"
android:id="@+id/tvOut"
android:layout_gravity="center_horizontal"
android:layout_marginBottom="50dp">
</TextView>
<Button
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:id="@+id/btnOk"
android:text="OK"
android:layout_width="100dp">
</Button>
<Button
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:id="@+id/btnCancel"
android:text="Cancel"
android:layout_width="100dp">
</Button>
</LinearLayout>
</LinearLayout>
[/syntax]Код: Выделить всё
[syntax=java]
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="ru.startandroid.p0101_listener_beta01"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="10"
android:targetSdkVersion="19" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="ru.startandroid.p0101_listener_beta01.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
[/syntax]- 04-17 16:07:14.297: D/AndroidRuntime(341): Shutting down VM
04-17 16:07:14.297: W/dalvikvm(341): threadid=1: thread exiting with uncaught exception (group=0x40015560)
04-17 16:07:14.327: E/AndroidRuntime(341): FATAL EXCEPTION: main
04-17 16:07:14.327: E/AndroidRuntime(341): java.lang.RuntimeException: Unable to start activity ComponentInfo{ru.startandroid.p0101_listener_beta01/ru.startandroid.p0101_listener_beta01.MainActivity}: java.lang.NullPointerException
04-17 16:07:14.327: E/AndroidRuntime(341): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
04-17 16:07:14.327: E/AndroidRuntime(341): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
04-17 16:07:14.327: E/AndroidRuntime(341): at android.app.ActivityThread.access$1500(ActivityThread.java:117)
04-17 16:07:14.327: E/AndroidRuntime(341): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
04-17 16:07:14.327: E/AndroidRuntime(341): at android.os.Handler.dispatchMessage(Handler.java:99)
04-17 16:07:14.327: E/AndroidRuntime(341): at android.os.Looper.loop(Looper.java:123)
04-17 16:07:14.327: E/AndroidRuntime(341): at android.app.ActivityThread.main(ActivityThread.java:3683)
04-17 16:07:14.327: E/AndroidRuntime(341): at java.lang.reflect.Method.invokeNative(Native Method)
04-17 16:07:14.327: E/AndroidRuntime(341): at java.lang.reflect.Method.invoke(Method.java:507)
04-17 16:07:14.327: E/AndroidRuntime(341): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
04-17 16:07:14.327: E/AndroidRuntime(341): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
04-17 16:07:14.327: E/AndroidRuntime(341): at dalvik.system.NativeStart.main(Native Method)
04-17 16:07:14.327: E/AndroidRuntime(341): Caused by: java.lang.NullPointerException
04-17 16:07:14.327: E/AndroidRuntime(341): at ru.startandroid.p0101_listener_beta01.MainActivity.onCreate(MainActivity.java:47)
04-17 16:07:14.327: E/AndroidRuntime(341): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
04-17 16:07:14.327: E/AndroidRuntime(341): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
04-17 16:07:14.327: E/AndroidRuntime(341): ... 11 more
04-17 16:07:18.567: I/Process(341): Sending signal. PID: 341 SIG: 9
Re: Урок 10. Оптимизируем реализацию обработчиков.
Ну, первое, что я увидел, это то, что View-элементы у тебя в fragment_main, а ищешь ты их в activity_main.Vikky_Leto писал(а):Благодарю всех за ответы. Исправила ошибки, но приложение по прежнему вылетает
MainActivity:fragment_mainКод: Выделить всё
[syntax=java] package ru.startandroid.p0101_listener_beta01; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v7.app.ActionBarActivity; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.Button; import android.widget.TextView; public class MainActivity extends ActionBarActivity { TextView tvOut; Button btnOk; Button btnCancel; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tvOut = (TextView) findViewById(R.id.tvOut); btnOk = (Button) findViewById(R.id.btnOk); btnCancel = (Button) findViewById(R.id.btnCancel); OnClickListener oclBtn = new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub // по id определеяем кнопку, вызвавшую этот обработчик switch (v.getId()) { case R.id.btnOk: // кнопка ОК tvOut.setText("Нажата кнопка ОК"); break; case R.id.btnCancel: // кнопка Cancel tvOut.setText("Нажата кнопка Cancel"); break; } } }; btnOk.setOnClickListener(oclBtn); btnCancel.setOnClickListener(oclBtn); if (savedInstanceState == null) { getSupportFragmentManager().beginTransaction() .add(R.id.container, new PlaceholderFragment()).commit(); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } /** * A placeholder fragment containing a simple view. */ public static class PlaceholderFragment extends Fragment { public PlaceholderFragment() { } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_main, container, false); return rootView; } } } [/syntax]Manifest:Код: Выделить всё
[syntax=java] <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/LinearLayout1" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="ru.startandroid.p0101_listener_beta01.MainActivity$PlaceholderFragment" > <LinearLayout android:id="@+id/linearLayout1" android:layout_height="match_parent" android:orientation="vertical" android:layout_width="match_parent" android:layout_margin="30dp" > <TextView android:layout_width="wrap_content" android:text="TextView" android:layout_height="wrap_content" android:id="@+id/tvOut" android:layout_gravity="center_horizontal" android:layout_marginBottom="50dp"> </TextView> <Button android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:id="@+id/btnOk" android:text="OK" android:layout_width="100dp"> </Button> <Button android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:id="@+id/btnCancel" android:text="Cancel" android:layout_width="100dp"> </Button> </LinearLayout> </LinearLayout> [/syntax]
+ Log:Код: Выделить всё
[syntax=java] <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="ru.startandroid.p0101_listener_beta01" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="10" android:targetSdkVersion="19" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="ru.startandroid.p0101_listener_beta01.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> [/syntax]
- 04-17 16:07:14.297: D/AndroidRuntime(341): Shutting down VM
04-17 16:07:14.297: W/dalvikvm(341): threadid=1: thread exiting with uncaught exception (group=0x40015560)
04-17 16:07:14.327: E/AndroidRuntime(341): FATAL EXCEPTION: main
04-17 16:07:14.327: E/AndroidRuntime(341): java.lang.RuntimeException: Unable to start activity ComponentInfo{ru.startandroid.p0101_listener_beta01/ru.startandroid.p0101_listener_beta01.MainActivity}: java.lang.NullPointerException
04-17 16:07:14.327: E/AndroidRuntime(341): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
04-17 16:07:14.327: E/AndroidRuntime(341): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
04-17 16:07:14.327: E/AndroidRuntime(341): at android.app.ActivityThread.access$1500(ActivityThread.java:117)
04-17 16:07:14.327: E/AndroidRuntime(341): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
04-17 16:07:14.327: E/AndroidRuntime(341): at android.os.Handler.dispatchMessage(Handler.java:99)
04-17 16:07:14.327: E/AndroidRuntime(341): at android.os.Looper.loop(Looper.java:123)
04-17 16:07:14.327: E/AndroidRuntime(341): at android.app.ActivityThread.main(ActivityThread.java:3683)
04-17 16:07:14.327: E/AndroidRuntime(341): at java.lang.reflect.Method.invokeNative(Native Method)
04-17 16:07:14.327: E/AndroidRuntime(341): at java.lang.reflect.Method.invoke(Method.java:507)
04-17 16:07:14.327: E/AndroidRuntime(341): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
04-17 16:07:14.327: E/AndroidRuntime(341): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
04-17 16:07:14.327: E/AndroidRuntime(341): at dalvik.system.NativeStart.main(Native Method)
04-17 16:07:14.327: E/AndroidRuntime(341): Caused by: java.lang.NullPointerException
04-17 16:07:14.327: E/AndroidRuntime(341): at ru.startandroid.p0101_listener_beta01.MainActivity.onCreate(MainActivity.java:47)
04-17 16:07:14.327: E/AndroidRuntime(341): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
04-17 16:07:14.327: E/AndroidRuntime(341): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
04-17 16:07:14.327: E/AndroidRuntime(341): ... 11 more
04-17 16:07:18.567: I/Process(341): Sending signal. PID: 341 SIG: 9
Для начала перемести их из fragment_main в activity_main и запусти.
Вот я запустил у себя и все заработало, вот только заменил "public class MainActivity extends ActionBarActivity" на "public class MainActivity extends Activity".
Re: Урок 10. Оптимизируем реализацию обработчиков.
Ссылка в подписи
R.id.team
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
-
Vikky_Leto
- Сообщения: 4
- Зарегистрирован: 12 апр 2014, 22:05
Re: Урок 10. Оптимизируем реализацию обработчиков.
Проблема решена. Работает и без замены на " public class MainActivity extends Activity". Где-то писали, что после обновлений размещать объекты нужно на fragment_main. Вот я и упорно пыталась это сделать.xamak писал(а): Ну, первое, что я увидел, это то, что View-элементы у тебя в fragment_main, а ищешь ты их в activity_main.
Для начала перемести их из fragment_main в activity_main и запусти.
Вот я запустил у себя и все заработало, вот только заменил "public class MainActivity extends ActionBarActivity" на "public class MainActivity extends Activity".
Всем спасибо за ответы.
Re: Урок 10. Оптимизируем реализацию обработчиков.
Помогите пжл.
public class MainActivity extends Activity {
TextView tvOut;
Button btnOk;
Button btnCancel;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvOut = (TextView) findViewById(R.id.tvOut);
btnOk = (Button) findViewById(R.id.btnOk);
btnCancel = (Button) findViewById(R.id.btnCancel);
OnClickListener oclBtn = new OnClickListener() {
@Override
public void onClick(View v) {
}
}
}
public void onClick(View v) {
switch (v.getId()) {
case R.id.btnOk:
tvOut.setText("Нажата кнопка ОК");
break;
case R.id.btnCancel:
tvOut.setText("Нажата кнопка Cancel");
break;
}
}
btnOk.setOnClickListener(oclBtn);
btnCancel.setOnClickListener(oclBtn);
}
}
}
Логи:
Multiple markers at this line
- Syntax error on token "oclBtn", VariableDeclaratorId expected after
this token
- oclBtn cannot be resolved to a variable
- Syntax error on token(s), misplaced construct(s)
Syntax error on token "}", { expected
public class MainActivity extends Activity {
TextView tvOut;
Button btnOk;
Button btnCancel;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvOut = (TextView) findViewById(R.id.tvOut);
btnOk = (Button) findViewById(R.id.btnOk);
btnCancel = (Button) findViewById(R.id.btnCancel);
OnClickListener oclBtn = new OnClickListener() {
@Override
public void onClick(View v) {
}
}
}
public void onClick(View v) {
switch (v.getId()) {
case R.id.btnOk:
tvOut.setText("Нажата кнопка ОК");
break;
case R.id.btnCancel:
tvOut.setText("Нажата кнопка Cancel");
break;
}
}
btnOk.setOnClickListener(oclBtn);
btnCancel.setOnClickListener(oclBtn);
}
}
}
Логи:
Multiple markers at this line
- Syntax error on token "oclBtn", VariableDeclaratorId expected after
this token
- oclBtn cannot be resolved to a variable
- Syntax error on token(s), misplaced construct(s)
Syntax error on token "}", { expected
- Вложения
-
- 75e947e0469bd053b7bd641fb886e865.png (15.85 КБ) 31305 просмотров
Re: Урок 10. Оптимизируем реализацию обработчиков.
У вас два метода onClick. Внимательней на скобки и расположение блоков кода в них.BAHINSON писал(а):Помогите пжл.
Re: Урок 10. Оптимизируем реализацию обработчиков.
Donart писал(а):У вас два метода onClick. Внимательней на скобки и расположение блоков кода в них.BAHINSON писал(а):Помогите пжл.
Рахмет
Re: Урок 10. Оптимизируем реализацию обработчиков.
Вопрос возник по третьему методу. Вызов OnClick из xml.
Хочется чтоб данный метод работал если элементы расположены в fragment_main.
Но при попытки разместить обработчик нажатия в
Ругаеться
то нормально компилится но при нажатии кнопки вываливается и ошибки такие
Собственно вопрос куда надо прописать обработчик чтоб корректно обрабатывал события из fragment_main.
полный код MainActivity.java
полный код fragment_main
Хочется чтоб данный метод работал если элементы расположены в fragment_main.
Но при попытки разместить обработчик нажатия в
Код: Выделить всё
public static class PlaceholderFragment extends Fragment {
TextView tvOut;
Button btnStart;
public PlaceholderFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, container, false);
public void onClickStart(View v) {
tvOut.setText("Нажата кнопка start");
}
return rootView;
}
}
а если сделать такMultiple markers at this line
- Syntax error on token "(", ; expected
- Syntax error on token ")", ; expected
- void is an invalid type for the variable
onClickStart
Код: Выделить всё
public static class PlaceholderFragment extends Fragment {
TextView tvOut;
Button btnStart;
public PlaceholderFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, container, false);
return rootView;
}
public void onClickStart(View v) {
tvOut.setText("Нажата кнопка start");
}
}
ну то есть он их в MainActivity не находит.05-30 07:10:05.798: E/AndroidRuntime(526): FATAL EXCEPTION: main
05-30 07:10:05.798: E/AndroidRuntime(526): java.lang.IllegalStateException: Could not find a method onClickStart(View) in the activity class ru.startandroid.develop.onclick.MainActivity for onClick handler on view class android.widget.Button with id 'btnStart'
05-30 07:10:05.798: E/AndroidRuntime(526): at android.view.View$1.onClick(View.java:3026)
05-30 07:10:05.798: E/AndroidRuntime(526): at android.view.View.performClick(View.java:3480)
05-30 07:10:05.798: E/AndroidRuntime(526): at android.view.View$PerformClick.run(View.java:13983)
05-30 07:10:05.798: E/AndroidRuntime(526): at android.os.Handler.handleCallback(Handler.java:605)
05-30 07:10:05.798: E/AndroidRuntime(526): at android.os.Handler.dispatchMessage(Handler.java:92)
05-30 07:10:05.798: E/AndroidRuntime(526): at android.os.Looper.loop(Looper.java:137)
05-30 07:10:05.798: E/AndroidRuntime(526): at android.app.ActivityThread.main(ActivityThread.java:4340)
05-30 07:10:05.798: E/AndroidRuntime(526): at java.lang.reflect.Method.invokeNative(Native Method)
05-30 07:10:05.798: E/AndroidRuntime(526): at java.lang.reflect.Method.invoke(Method.java:511)
05-30 07:10:05.798: E/AndroidRuntime(526): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
05-30 07:10:05.798: E/AndroidRuntime(526): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
05-30 07:10:05.798: E/AndroidRuntime(526): at dalvik.system.NativeStart.main(Native Method)
05-30 07:10:05.798: E/AndroidRuntime(526): Caused by: java.lang.NoSuchMethodException: onClickStart [class android.view.View]
05-30 07:10:05.798: E/AndroidRuntime(526): at java.lang.Class.getConstructorOrMethod(Class.java:460)
05-30 07:10:05.798: E/AndroidRuntime(526): at java.lang.Class.getMethod(Class.java:915)
05-30 07:10:05.798: E/AndroidRuntime(526): at android.view.View$1.onClick(View.java:3019)
05-30 07:10:05.798: E/AndroidRuntime(526): ... 11 more
Собственно вопрос куда надо прописать обработчик чтоб корректно обрабатывал события из fragment_main.
полный код MainActivity.java
Код: Выделить всё
package ru.startandroid.develop.onclick;
import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState == null) {
getFragmentManager().beginTransaction()
.add(R.id.container, new PlaceholderFragment())
.commit();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
/**
* A placeholder fragment containing a simple view.
*/
public static class PlaceholderFragment extends Fragment {
TextView tvOut;
Button btnStart;
public PlaceholderFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, container, false);
return rootView;
}
public void onClickStart(View v) {
tvOut.setText("Нажата кнопка start");
}
}
}
Код: Выделить всё
<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"
tools:context="ru.startandroid.develop.onclick.MainActivity$PlaceholderFragment" >
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TextView
android:id="@+id/tvOut"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="50dp"
android:text="TextView" />
<Button
android:id="@+id/btnStart"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClickStart"
android:text="start" />
</LinearLayout>
</RelativeLayout>
Re: Урок 10. Оптимизируем реализацию обработчиков.
Это все хорошо, но где вы находите элементы view? где (Button) rootView.findViewById(R.id.btnStart) ?Хочется чтоб данный метод работал если элементы расположены в fragment_main.
Java так не умеет, учите язык.Но при попытки разместить обработчик нажатия в
Re: Урок 10. Оптимизируем реализацию обработчиков.
можно в xml у Button прописать "android:onClick="onClickStart"" и тогда при нажатии на эту кнопку будет вызываться эта функция. никаких findViewById и присвоений обработчиков в коде не нужно. (последние строчки данного урока)Donart писал(а):Это все хорошо, но где вы находите элементы view? где (Button) rootView.findViewById(R.id.btnStart) ?Хочется чтоб данный метод работал если элементы расположены в fragment_main.
shyrick
попробуйте написать метод onClickStart() во фрагменте, а не в активити.
Если не поможет то используйте интерфейс OnClickListener.
Re: Урок 10. Оптимизируем реализацию обработчиков.
Через OnClickListener у меня такая конструкция получаетьсяklblk писал(а):Donart писал(а): shyrick
попробуйте написать метод onClickStart() во фрагменте, а не в активити.
Если не поможет то используйте интерфейс OnClickListener.
Код: Выделить всё
public static class PlaceholderFragment extends Fragment implements OnClickListener {
TextView tvOut;
Button btnOk;
Button btnCancel;
public PlaceholderFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, container, false);
tvOut = (TextView) rootView.findViewById(R.id.tvOut);
btnOk = (Button) rootView.findViewById(R.id.btnOk);
btnCancel = (Button) rootView.findViewById(R.id.btnCancel);
btnOk.setOnClickListener(this);
btnCancel.setOnClickListener(this);
return rootView;
}
@Override
public void onClick(View v) {
// по id определеяем кнопку, вызвавшую этот обработчик
switch (v.getId()) {
case R.id.btnOk:
// кнопка ОК
tvOut.setText("Нажата кнопка ОК");
break;
case R.id.btnCancel:
// кнопка Cancel
tvOut.setText("Нажата кнопка Cancel");
break;
}
}
Код: Выделить всё
public static class PlaceholderFragment extends Fragment {
TextView tvOut;
Button btnOk, btnCancel;
public PlaceholderFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, container, false);
tvOut = (TextView) rootView.findViewById(R.id.tvOut);
btnOk = (Button) rootView.findViewById(R.id.btnOk);
btnCancel = (Button) rootView.findViewById(R.id.btnCancel);
OnClickListener oclBtn = new OnClickListener() {
@Override
public void onClick(View v) {
// по id определеяем кнопку, вызвавшую этот обработчик
switch (v.getId()) {
case R.id.btnOk:
// кнопка ОК
tvOut.setText("Нажата кнопка ОК");
break;
case R.id.btnCancel:
// кнопка Cancel
tvOut.setText("Нажата кнопка Cancel");
break;
}
}
};
btnOk.setOnClickListener(oclBtn);
btnCancel.setOnClickListener(oclBtn);
return rootView;
}
}
а вот с последним способом не получается при попытки пихнуть в public View onCreateView материться
при выносе сюда public static class PlaceholderFragment extends Fragment
валиться с ошибками при нажатии...
Re: Урок 10. Оптимизируем реализацию обработчиков.
Потому что так и не сработает , Fragment так не умеет. Только с OnClickListener.а вот с последним способом не получается при попытки пихнуть в public View onCreateView материться
Re: Урок 10. Оптимизируем реализацию обработчиков.
Всем View построенным из xml-разметки (впрочем, как и построенным непосредственно в коде) передается контекст Activity, у фрагментов нет своего контекста, поскольку они создаются не системой, а приложением, они используют контекст той Activity которая их создает. Запомните раз и навсегда, фрагмент это не компонент Андроид, это как бы надстройка, дополнение к Activity. Поэтому никакие View и их иерархия непосредственно к ним не привязана, вы думаете, что они находятся во фрагменте, но на самом деле они находятся в Activity, а фрагмент используется только как контейнер и не более того.shyrick писал(а):Вопрос возник по третьему методу. Вызов OnClick из xml.
Хочется чтоб данный метод работал если элементы расположены в fragment_main.
В соответствии с вышеизложенным, если смотреть с точки зрения View, то они понятия не имеют, что находятся во фрагменте и ничего не знают о нем, зато они в своем распоряжении имеют контекст Activity, вот через него и работает код, который обрабатывает атрибут onClick, для более пытливых поясню - это делается через отражение (reflection), есть такой механизм в Java. Поэтому View ну никак не сможет найти через отражение ваш метод, если вы его поместите во фрагмент, он будет пытаться найти его только в Activity.
Если вы хотите обрабатывать нажатия кнопок во фрагменте, то только через интерфейсы - Listener-ы и никак иначе.
Как вариант, можно использовать атрибут onClick xml-разметки, но метод обработки размещать в Activity, а во фрагменте сделать такой же метод, который будет вызываться из Activity.
---MyActivity---
...
public void onClick(View v) {
((MyFragment)getFragmentManager().findFragmentByTag("MyFragment_tag")).onClick(v);
}
...
Re: Урок 10. Оптимизируем реализацию обработчиков.
Спасибо за разъяснение.
Попробую построить такую конструкцию но уже сейчас вижу что через Listener-ы код читабельные и понятнее получиться.
Может кто посоветует толковую книжку по жабе чтоб легче было понимать уроки данные. Желательно на русском для первичного ознакомления.
Попробую построить такую конструкцию но уже сейчас вижу что через Listener-ы код читабельные и понятнее получиться.
Может кто посоветует толковую книжку по жабе чтоб легче было понимать уроки данные. Желательно на русском для первичного ознакомления.
Re: Урок 10. Оптимизируем реализацию обработчиков.
viewtopic.php?f=17&t=147shyrick писал(а): Может кто посоветует толковую книжку по жабе чтоб легче было понимать уроки данные. Желательно на русском для первичного ознакомления.
Re: Урок 10. Оптимизируем реализацию обработчиков.
Я новачок ...при запускание програма вилетаєет
Activity
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends Activity {
TextView tvOut;
Button btnStart;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
public void onClick(View v) {
tvOut.setText("nazhata knopka");
}
}
main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:orientation="horizontal">
<LinearLayout
android:id="@+id/linearLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="30dp"
android:orientation="vertical" >
<TextView
android:id="@+id/tvOut"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginBottom="50dp"
android:text="TextView" />
<Button
android:id="@+id/btnStart"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClickStart"
android:text="start" />
<Button/>
</LinearLayout>
</LinearLayout>
Activity
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends Activity {
TextView tvOut;
Button btnStart;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
public void onClick(View v) {
tvOut.setText("nazhata knopka");
}
}
main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:orientation="horizontal">
<LinearLayout
android:id="@+id/linearLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="30dp"
android:orientation="vertical" >
<TextView
android:id="@+id/tvOut"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginBottom="50dp"
android:text="TextView" />
<Button
android:id="@+id/btnStart"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClickStart"
android:text="start" />
<Button/>
</LinearLayout>
</LinearLayout>
- Вложения
-
- Записати.PNG (53.88 КБ) 31170 просмотров
Re: Урок 10. Оптимизируем реализацию обработчиков.
нет у вас функции "onClickStart()"
и TextView tvOut - не определен.
и учитесь оформлять код на форуме
и TextView tvOut - не определен.
и учитесь оформлять код на форуме