ViewPager 和 Android Wear = crash
ViewPager and Android Wear = crash
_
大家好Whosebug的成员们!
我在 "normal" activity.
上成功地使用了 ViewPager (VP)
现在我尝试对 Android Wear 应用程序使用几乎相同的方法。
在包含 VP 的 MainActivity 中,我遇到了不同的错误,例如:
- 错误 1:(getFragmentManager() -> "Cannot be applied"
- 错误2:超级(经理); -> "Cannot be applied"
- 错误 3:public 片段 getItem(int i); -> "Incompatible return type"
我找到了这个线程,并且能够通过更改导入 + 更改 build.gradle 来修复这些错误。
How to implement view pager in Android watch?
这些现在是我在 MainActivity.java 中的导入:
import android.app.Fragment;
import android.app.FragmentManager;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v13.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.wearable.activity.WearableActivity;
import java.util.ArrayList;
import java.util.List;
这是 MainActivity 的其余部分:
public class MainActivity extends WearableActivity
{
ViewPager vp; // Variable for Viewpager
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); // Link to layout
ViewPager vp = findViewById(R.id.vp); // Link variable to ID
SetUpViewPager(vp); // Run viewpager method
}
public void SetUpViewPager(ViewPager viewpager)
{
MyViewPagerAdapter Adapter = new MyViewPagerAdapter(getFragmentManager());
Adapter.AddPageFragment(new Fragment1(), "Fragment1"); // Load page 1 inside of ViewPager
Adapter.AddPageFragment(new Fragment2(), "Fragment2"); // Load page 2 inside of ViewPager
viewpager.setAdapter(Adapter);
}
public class MyViewPagerAdapter extends android.support.v4.app.FragmentPagerAdapter
{
private List<Fragment> MyFragment = new ArrayList<>();
private List<String> MyPageTitle = new ArrayList<>();
public MyViewPagerAdapter(FragmentManager manager)
{
super(manager);
}
public void AddPageFragment(Fragment Frag, String Title)
{
MyFragment.add(Frag);
MyPageTitle.add(Title);
}
@Override
public Fragment getItem(int i)
{
return MyFragment.get(i);
}
@Nullable
@Override
public CharSequence getPageTitle(int position)
{
return MyPageTitle.get(position);
}
@Override
public int getCount()
{
return 2; // 2 pages total
}
}
}
奇怪的是,就是说ViewPager vp; -> 字段 'vp' 从未使用过!
Fragment1:(Fragment2 除了 2/two 之外都是一样的)
import android.app.Fragment;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class Fragment1 extends Fragment
{
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)
{
View fragmentOne = inflater.inflate(R.layout.fragment1, container, false); // Link view and layout
return fragmentOne;
}
}
片段的 XML 文件只是每个 1 个按钮的约束布局。
content_main.xml 包含访问 activity_main.xml 的 VP。
我在普通的智能手机设备上使用了同样的方法,它完美地工作了。
问题是每次我在 Wear Emulator 上启动应用程序时,它都会立即崩溃。
Logcat 是这么说的:
10-23 14:40:32.909 2203-2203/com.example.user.wearvp E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.user.wearvp, PID: 2203
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.user.wearvp/com.example.user.wearvp.MainActivity}: java.lang.NullPointerException:
Attempt to invoke virtual method 'void android.support.v4.view.ViewPager.setAdapter(android.support.v4.view.PagerAdapter)' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5422)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: java.lang.NullPointerException:
Attempt to invoke virtual method 'void android.support.v4.view.ViewPager.setAdapter(android.support.v4.view.PagerAdapter)' on a null object reference
at com.example.user.wearvp.MainActivity.SetUpViewPager(MainActivity.java:35)
at com.example.user.wearvp.MainActivity.onCreate(MainActivity.java:24)
at android.app.Activity.performCreate(Activity.java:6251)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5422)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
任何帮助将不胜感激!
P.S:
如果我忘了提任何重要的事情,请问,我会给你所需的信息!
此致
堆栈跟踪表明在您的 activity_main.xml
布局文件中没有定义 ID 为 vp
的视图。我不完全确定你的意思:
The content_main.xml contains the VP which accesses the activity_main.xml.
如果在 content_main.xml
布局中定义了 vp
,那么这可能是您应该与 setContentView()
一起使用的布局(而不是当前的 activity_main.xml
)。
Strange is that is says ViewPager vp; -> Field 'vp' is never used!
局部变量 vp
(在 onCreate 方法中定义)正在隐藏实例变量 vp
。如果您需要它具有对象级范围,只需在为其赋值时删除 ViewPager
。
_
大家好Whosebug的成员们!
我在 "normal" activity.
上成功地使用了 ViewPager (VP)现在我尝试对 Android Wear 应用程序使用几乎相同的方法。
在包含 VP 的 MainActivity 中,我遇到了不同的错误,例如:
- 错误 1:(getFragmentManager() -> "Cannot be applied"
- 错误2:超级(经理); -> "Cannot be applied"
- 错误 3:public 片段 getItem(int i); -> "Incompatible return type"
我找到了这个线程,并且能够通过更改导入 + 更改 build.gradle 来修复这些错误。
How to implement view pager in Android watch?
这些现在是我在 MainActivity.java 中的导入:
import android.app.Fragment;
import android.app.FragmentManager;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v13.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.wearable.activity.WearableActivity;
import java.util.ArrayList;
import java.util.List;
这是 MainActivity 的其余部分:
public class MainActivity extends WearableActivity
{
ViewPager vp; // Variable for Viewpager
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); // Link to layout
ViewPager vp = findViewById(R.id.vp); // Link variable to ID
SetUpViewPager(vp); // Run viewpager method
}
public void SetUpViewPager(ViewPager viewpager)
{
MyViewPagerAdapter Adapter = new MyViewPagerAdapter(getFragmentManager());
Adapter.AddPageFragment(new Fragment1(), "Fragment1"); // Load page 1 inside of ViewPager
Adapter.AddPageFragment(new Fragment2(), "Fragment2"); // Load page 2 inside of ViewPager
viewpager.setAdapter(Adapter);
}
public class MyViewPagerAdapter extends android.support.v4.app.FragmentPagerAdapter
{
private List<Fragment> MyFragment = new ArrayList<>();
private List<String> MyPageTitle = new ArrayList<>();
public MyViewPagerAdapter(FragmentManager manager)
{
super(manager);
}
public void AddPageFragment(Fragment Frag, String Title)
{
MyFragment.add(Frag);
MyPageTitle.add(Title);
}
@Override
public Fragment getItem(int i)
{
return MyFragment.get(i);
}
@Nullable
@Override
public CharSequence getPageTitle(int position)
{
return MyPageTitle.get(position);
}
@Override
public int getCount()
{
return 2; // 2 pages total
}
}
}
奇怪的是,就是说ViewPager vp; -> 字段 'vp' 从未使用过!
Fragment1:(Fragment2 除了 2/two 之外都是一样的)
import android.app.Fragment;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class Fragment1 extends Fragment
{
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)
{
View fragmentOne = inflater.inflate(R.layout.fragment1, container, false); // Link view and layout
return fragmentOne;
}
}
片段的 XML 文件只是每个 1 个按钮的约束布局。 content_main.xml 包含访问 activity_main.xml 的 VP。 我在普通的智能手机设备上使用了同样的方法,它完美地工作了。
问题是每次我在 Wear Emulator 上启动应用程序时,它都会立即崩溃。
Logcat 是这么说的:
10-23 14:40:32.909 2203-2203/com.example.user.wearvp E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.user.wearvp, PID: 2203
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.user.wearvp/com.example.user.wearvp.MainActivity}: java.lang.NullPointerException:
Attempt to invoke virtual method 'void android.support.v4.view.ViewPager.setAdapter(android.support.v4.view.PagerAdapter)' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5422)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: java.lang.NullPointerException:
Attempt to invoke virtual method 'void android.support.v4.view.ViewPager.setAdapter(android.support.v4.view.PagerAdapter)' on a null object reference
at com.example.user.wearvp.MainActivity.SetUpViewPager(MainActivity.java:35)
at com.example.user.wearvp.MainActivity.onCreate(MainActivity.java:24)
at android.app.Activity.performCreate(Activity.java:6251)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5422)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
任何帮助将不胜感激!
P.S:
如果我忘了提任何重要的事情,请问,我会给你所需的信息!
此致
堆栈跟踪表明在您的 activity_main.xml
布局文件中没有定义 ID 为 vp
的视图。我不完全确定你的意思:
The content_main.xml contains the VP which accesses the activity_main.xml.
如果在 content_main.xml
布局中定义了 vp
,那么这可能是您应该与 setContentView()
一起使用的布局(而不是当前的 activity_main.xml
)。
Strange is that is says ViewPager vp; -> Field 'vp' is never used!
局部变量 vp
(在 onCreate 方法中定义)正在隐藏实例变量 vp
。如果您需要它具有对象级范围,只需在为其赋值时删除 ViewPager
。