- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在做一个小项目,我想使用 slider 菜单。长话短说,我碰巧从某个网站找到了使用抽屉的 slider 菜单的源代码,它在我的设备上运行良好。但是,我对将我以前的 Activity 迁移到此 slider 菜单感到有点困惑,因为它们为 listView 上的每个单独项目使用 fragment 。
为了简单起见,我想迁移一个能够执行 Ping 功能的 Activity 。它的 xml 文件由一个 EditText、一个 Button 和一个用于显示输出的 TextView 组成。
现在我确实设法“成功”将该 Activity 迁移到此 fragment 中。抽屉运行良好,但我卡住了,因为在我点击 ping 按钮后应用程序总是强制关闭。
PS:我还没有更改类名,不好意思
下面是我的代码:
这是我最初的 Ping Activity :
package my.jlm;
import java.io.IOException;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.UnknownHostException;
import android.app.Activity;
import android.os.Bundle;
import android.text.Editable;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class Ping extends Activity {
EditText edit;
TextView text;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_ping);
edit = (EditText)findViewById(R.id.editText1);
edit.setText("192.168.1.1");
text = (TextView)findViewById(R.id.textView1);
Button button = (Button)findViewById(R.id.button1);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Editable host = edit.getText();
try {
String pingCmd = "ping -c 5 " + host;
String pingResult = "";
Runtime r = Runtime.getRuntime();
Process p = r.exec(pingCmd);
BufferedReader in = new BufferedReader(new
InputStreamReader(p.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null) {
System.out.println(inputLine);
text.setText(inputLine + "\n\n");
pingResult += inputLine;
text.setText(pingResult);
}
in.close();
}//try
catch (IOException e) {
System.out.println(e);
}
}
});
}}
这个 FindPeopleFragment.java(这应该是 PingFragment.java)。我认为这是一次成功的尝试,因为 eclipse 没有显示任何红色标记,但如果我错了,请纠正我。
package info.androidhive.slidingmenu;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import android.app.Fragment;
import android.content.Intent;
import android.os.Bundle;
import android.text.Editable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class FindPeopleFragment extends Fragment
implements OnClickListener
{
EditText edit;
TextView text;
Button button;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.activity_ping, container, false);
EditText edit = (EditText) rootView.findViewById(R.id.editText1);
edit.setText("192.168.1.1");
text = (TextView) rootView.findViewById(R.id.textView1);
button = (Button)rootView.findViewById(R.id.button1);
button.setOnClickListener(onClickListener);
return rootView;
}
@Override
public void onClick(View v) {
Editable host = edit.getText();
try {
String pingCmd = "ping -c 5 " + host;
String pingResult = "";
Runtime r = Runtime.getRuntime();
Process p = r.exec(pingCmd);
BufferedReader in = new BufferedReader(new
InputStreamReader(p.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null) {
System.out.println(inputLine);
text.setText(inputLine + "\n\n");
pingResult += inputLine;
text.setText(pingResult);
}
in.close();
}//try
catch (IOException e) {
System.out.println(e);
}
}
};;
最后这是我上述项目的 list
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="info.androidhive.slidingmenu"
android:versionCode="1"
android:versionName="1.0" >
<permission
android:name="my.jlm.permission.MAPS_RECEIVE"
android:protectionLevel="signature"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="museumjakarta.source.permission.MAPS_RECEIVE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-sdk
android:minSdkVersion="11"
android:targetSdkVersion="17" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="info.androidhive.slidingmenu.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>
这是我的 LogCat 错误日志:
03-15 09:07:41.160: E/AndroidRuntime(1267): FATAL EXCEPTION: main
03-15 09:07:41.160: E/AndroidRuntime(1267): Process: info.androidhive.slidingmenu, PID: 1267
03-15 09:07:41.160: E/AndroidRuntime(1267): java.lang.NullPointerException
03-15 09:07:41.160: E/AndroidRuntime(1267): at info.androidhive.slidingmenu.FindPeopleFragment.onClick(FindPeopleFragment.java:53)
03-15 09:07:41.160: E/AndroidRuntime(1267): at android.view.View.performClick(View.java:4424)
03-15 09:07:41.160: E/AndroidRuntime(1267): at android.view.View$PerformClick.run(View.java:18383)
03-15 09:07:41.160: E/AndroidRuntime(1267): at android.os.Handler.handleCallback(Handler.java:733)
03-15 09:07:41.160: E/AndroidRuntime(1267): at android.os.Handler.dispatchMessage(Handler.java:95)
03-15 09:07:41.160: E/AndroidRuntime(1267): at android.os.Looper.loop(Looper.java:137)
03-15 09:07:41.160: E/AndroidRuntime(1267): at android.app.ActivityThread.main(ActivityThread.java:4998)
03-15 09:07:41.160: E/AndroidRuntime(1267): at java.lang.reflect.Method.invokeNative(Native Method)
03-15 09:07:41.160: E/AndroidRuntime(1267): at java.lang.reflect.Method.invoke(Method.java:515)
03-15 09:07:41.160: E/AndroidRuntime(1267): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777)
03-15 09:07:41.160: E/AndroidRuntime(1267): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593)
03-15 09:07:41.160: E/AndroidRuntime(1267): at dalvik.system.NativeStart.main(Native Method)
这里简单说说我的经历:从 Drawer ListView 中单击后,Ping xml 页面显示出来,但是当我单击其中的 Ping 按钮时,应用程序崩溃,导致上述错误日志。帮我解决这个问题,非常感谢。
PS:我正在使用 eclipse adt,因为我无法在我的 AMD 处理器上运行 AS。
编辑:认为这可能有帮助,我将发布此 fragment 的 mainActivity.java:
package info.androidhive.slidingmenu;
import info.androidhive.slidingmenu.adapter.NavDrawerListAdapter;
import info.androidhive.slidingmenu.model.NavDrawerItem;
import java.util.ArrayList;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.content.res.Configuration;
import android.content.res.TypedArray;
import android.os.Bundle;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.widget.DrawerLayout;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
public class MainActivity extends Activity {
private DrawerLayout mDrawerLayout;
private ListView mDrawerList;
private ActionBarDrawerToggle mDrawerToggle;
// nav drawer title
private CharSequence mDrawerTitle;
// used to store app title
private CharSequence mTitle;
// slide menu items
private String[] navMenuTitles;
private TypedArray navMenuIcons;
private ArrayList<NavDrawerItem> navDrawerItems;
private NavDrawerListAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTitle = mDrawerTitle = getTitle();
// load slide menu items
navMenuTitles = getResources().getStringArray(R.array.nav_drawer_items);
// nav drawer icons from resources
navMenuIcons = getResources()
.obtainTypedArray(R.array.nav_drawer_icons);
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
mDrawerList = (ListView) findViewById(R.id.list_slidermenu);
navDrawerItems = new ArrayList<NavDrawerItem>();
// adding nav drawer items to array
// Home
navDrawerItems.add(new NavDrawerItem(navMenuTitles[0], navMenuIcons.getResourceId(0, -1)));
// Find People
navDrawerItems.add(new NavDrawerItem(navMenuTitles[1], navMenuIcons.getResourceId(1, -1)));
// Photos
navDrawerItems.add(new NavDrawerItem(navMenuTitles[2], navMenuIcons.getResourceId(2, -1)));
// Communities, Will add a counter here
navDrawerItems.add(new NavDrawerItem(navMenuTitles[3], navMenuIcons.getResourceId(3, -1), true, "22"));
// Pages
navDrawerItems.add(new NavDrawerItem(navMenuTitles[4], navMenuIcons.getResourceId(4, -1)));
// What's hot, We will add a counter here
navDrawerItems.add(new NavDrawerItem(navMenuTitles[5], navMenuIcons.getResourceId(5, -1), true, "50+"));
// Recycle the typed array
navMenuIcons.recycle();
mDrawerList.setOnItemClickListener(new SlideMenuClickListener());
// setting the nav drawer list adapter
adapter = new NavDrawerListAdapter(getApplicationContext(),
navDrawerItems);
mDrawerList.setAdapter(adapter);
// enabling action bar app icon and behaving it as toggle button
getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setHomeButtonEnabled(true);
mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
R.drawable.ic_drawer, //nav menu toggle icon
R.string.app_name, // nav drawer open - description for accessibility
R.string.app_name // nav drawer close - description for accessibility
) {
public void onDrawerClosed(View view) {
getActionBar().setTitle(mTitle);
// calling onPrepareOptionsMenu() to show action bar icons
invalidateOptionsMenu();
}
public void onDrawerOpened(View drawerView) {
getActionBar().setTitle(mDrawerTitle);
// calling onPrepareOptionsMenu() to hide action bar icons
invalidateOptionsMenu();
}
};
mDrawerLayout.setDrawerListener(mDrawerToggle);
if (savedInstanceState == null) {
// on first time display view for first nav item
displayView(0);
}
}
/**
* Slide menu item click listener
* */
private class SlideMenuClickListener implements
ListView.OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
// display view for selected nav drawer item
displayView(position);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// toggle nav drawer on selecting action bar app icon/title
if (mDrawerToggle.onOptionsItemSelected(item)) {
return true;
}
// Handle action bar actions click
switch (item.getItemId()) {
case R.id.action_settings:
return true;
default:
return super.onOptionsItemSelected(item);
}
}
/* *
* Called when invalidateOptionsMenu() is triggered
*/
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
// if nav drawer is opened, hide the action items
boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList);
menu.findItem(R.id.action_settings).setVisible(!drawerOpen);
return super.onPrepareOptionsMenu(menu);
}
/**
* Diplaying fragment view for selected nav drawer list item
* */
private void displayView(int position) {
// update the main content by replacing fragments
Fragment fragment = null;
switch (position) {
case 0:
fragment = new HomeFragment();
break;
case 1:
fragment = new FindPeopleFragment();
break;
case 2:
fragment = new PhotosFragment();
break;
case 3:
fragment = new CommunityFragment();
break;
case 4:
fragment = new PagesFragment();
break;
case 5:
fragment = new WhatsHotFragment();
break;
default:
break;
}
if (fragment != null) {
FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.frame_container, fragment).commit();
// update selected item and title, then close the drawer
mDrawerList.setItemChecked(position, true);
mDrawerList.setSelection(position);
setTitle(navMenuTitles[position]);
mDrawerLayout.closeDrawer(mDrawerList);
} else {
// error in creating fragment
Log.e("MainActivity", "Error in creating fragment");
}
}
@Override
public void setTitle(CharSequence title) {
mTitle = title;
getActionBar().setTitle(mTitle);
}
/**
* When using the ActionBarDrawerToggle, you must call it during
* onPostCreate() and onConfigurationChanged()...
*/
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
// Sync the toggle state after onRestoreInstanceState has occurred.
mDrawerToggle.syncState();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Pass any configuration change to the drawer toggls
mDrawerToggle.onConfigurationChanged(newConfig);
}
}
最佳答案
使用以下代码行:
button = (Button)rootView.findViewById(R.id.button1);
button.setOnClickListener(this); // Best Solution <---
button.setOnClickListener(rootView);
或
button.setOnClickListener(getActivity());
然后,您必须调用 onClick()
方法,如下所示:
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button1:
// CODE TO DO
break;
}
}
此外,您还可以:
import android.view.View.OnClickListener;
button = (Button) rootView.findViewById(R.id.button1);
button.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// Your Code Lines
}
我认为您的代码很好。您唯一需要做的就是添加:button.setOnClickListener(this);
然后,添加 switch
OnClick
方法中的 v.getId()
语句。
package info.androidhive.slidingmenu;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import android.app.Fragment;
import android.content.Intent;
import android.os.Bundle;
import android.text.Editable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class FindPeopleFragment extends Fragment
implements View.OnClickListener {
EditText edit;
TextView text;
Button button;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.activity_ping, container, false);
EditText edit = (EditText) rootView.findViewById(R.id.editText1);
edit.setText("192.168.1.1");
text = (TextView) rootView.findViewById(R.id.textView1);
button = (Button) rootView.findViewById(R.id.button1);
button.setOnClickListener(this);
return rootView;
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button1:
Editable host = edit.getText();
try {
String pingCmd = "ping -c 5 " + host;
String pingResult = "";
Runtime r = Runtime.getRuntime();
Process p = r.exec(pingCmd);
BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
String inputLine;
while ((inputLine = in .readLine()) != null) {
System.out.println(inputLine);
text.setText(inputLine + "\n\n");
pingResult += inputLine;
text.setText(pingResult);
} in .close();
} //try
catch (IOException e) {
System.out.println(e);
}
break;
case default:
log.i("Inf", "there's no click");
break;
}
}
}
package info.androidhive.slidingmenu;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import android.app.Fragment;
import android.content.Intent;
import android.os.Bundle;
import android.text.Editable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class FindPeopleFragment extends Fragment
implements OnClickListener {
EditText edit;
TextView text;
Button button;
Editable Edit2 ;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.activity_ping, container, false);
EditText edit = (EditText) rootView.findViewById(R.id.editText1);
edit.setText("192.168.1.1");
Edit2 = edit.getText();
text = (TextView) rootView.findViewById(R.id.textView1);
button = (Button) rootView.findViewById(R.id.button1);
button.setOnClickListener(this);
return rootView;
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button1:
try {
String pingCmd = "ping -c 5 " + Edit2;
String pingResult = "";
Runtime r = Runtime.getRuntime();
Process p = r.exec(pingCmd);
BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
String inputLine;
while ((inputLine = in .readLine()) != null) {
System.out.println(inputLine);
text.setText(inputLine + "\n\n");
pingResult += inputLine;
text.setText(pingResult);
} in .close();
} //try
catch (IOException e) {
System.out.println(e);
}
break;
}
}
}
关于android - 如何在 fragment 中实现按钮 SetOnClickListener?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29063082/
我读到了 avoiding memory leaks 为避免上下文相关的内存泄漏,请记住以下几点: 尝试使用 context-application 而不是 context-activity 我有两个
我想在按钮单击时显示图像,但我的代码中有三个错误。怎么了? class name "SequencerActivity" SequencerActivity 类型必须实现继承的抽象方法DialogIn
我一直在摆弄 Snake示例代码,我正在尝试修改它以进行培训,并希望增加对 Android 工作原理的理解。 到目前为止,我已经添加了两个按钮 + 相应的 setOnClickListener 代码,
我是 android 的新手,我想知道如果我不在我的布局之一中使用“setOnClickListener”到底会发生什么,因为看起来我的应用程序仍然可以正常运行而没有任何错误。谁能给我解释一下? 例子
我花了一整天的时间试图弄清楚如何使这项工作成功。我成功设置了自定义适配器和我的 ListView。问题是我得到了单击的项目的正确位置,但该项目始终是列表中的最后一个。 更重要的是,我在另一个线程中调用
我的代码有时会出现空指针异常。奇怪的是,这种情况并不是每次都会发生,我也不知道为什么。帮忙? package net.obviam.droidz; public class HomeView exte
我想在按钮 A 中进行处理时禁用按钮 B。 public class GoJump extends Activity{ Button answerA, answerB; public void
因此,每当我尝试使用 set onclicklistener 并尝试在模拟器上运行它时,它都会显示一条错误消息,指出应用程序已停止。当我取出那部分代码时,它开始工作。 这是我的代码:(Mainacti
我正在 ActivityMain.java 中创建按钮编译器无法识别 onSetClickListener。我错过了什么? package com.example.mydiceapp; import
好吧,如果您没有看到我之前的问题,我问如何使用 2 个命令按钮将文本从 edittext 导入到 textview 中?这是我所做的: 我不断收到此错误 "Syntax error on token
我正在使用GitHub我的应用程序 UI 的 FlatUI 类。我已经使用 FlatButtons 成功生成了布局,现在我想为这些按钮设置监听器。正如 FlatUI 示例代码中提到的,我在 Activ
我正在尝试在 Android 应用程序中为 recycleview 设置 onlclick 监听器,但尽管一切都正确,但我仍然在 IDE 中收到上述错误。 这是 DrinksActivity 类的完整
我想从此 fragment 访问来自不属于该 fragment 的另一个布局的 View 。这就是我得到 NullPointerException 的原因。 我该如何解决这个问题? fragment
您好,我收到错误消息: the method setonclickListener(new onclickListener(){}) is undefined for the type button
我在 listView 中按下一个列表项。如何从 ListView 项目转到我的另一个 Activity ?请帮助我了解如何解决这个问题。 这是我的代码,如果: package com.example
这是我的java代码...... public class Account extends Activity { private Database v1; EditText telefon,sifre
我是 android 开发的新手,我意识到在真实世界的示例中使用所有界面比在试图向您展示如何使用界面的示例代码中使用它们要困难得多。 因为我想理解我输入的每一行,所以我将从这里开始: Button c
我正在使用 tabbedActivity 制作一个用于研究的应用程序加上按钮没有采取行动,有人知道解释原因,我已经尝试了几种形式但都没有行动,不会给出错误并破坏应用程序但按钮什么都没有 @Overri
我使用的表布局包含来自 SQLite 数据库的行,因此我添加行时动态添加 View 到行。现在,我在每一行中添加了 imageButton 来处理行版本和将其添加到 SQLite 数据库的其他行。我想
首先,请不要将其标记为重复。我在 stackoverflow.com 上发现了类似的问题,但找不到我的解决方案。请看这张图片 Screenshot 我正在尝试检查 EditText 不应为空。但是 s
我是一名优秀的程序员,十分优秀!