在本文中,我们将带你了解android–片段翻转和丢失图像在这篇文章中,我们将为您详细介绍android–片段翻转和丢失图像的方方面面,并解答android翻转动画常见的疑惑,同时我们还将给您一些技巧
在本文中,我们将带你了解android – 片段翻转和丢失图像在这篇文章中,我们将为您详细介绍android – 片段翻转和丢失图像的方方面面,并解答android翻转动画常见的疑惑,同时我们还将给您一些技巧,以帮助您实现更有效的Android Studio – 使用依赖于另一个Android库的Android库构建Android项目、Android Studio:在片段类中生成饼图(MPAndroidChart)返回黑屏、android – ViewPager片段 – 片段未显示、android – 一些片段在旋转时丢失。
本文目录一览:- android – 片段翻转和丢失图像(android翻转动画)
- Android Studio – 使用依赖于另一个Android库的Android库构建Android项目
- Android Studio:在片段类中生成饼图(MPAndroidChart)返回黑屏
- android – ViewPager片段 – 片段未显示
- android – 一些片段在旋转时丢失
android – 片段翻转和丢失图像(android翻转动画)
我有两个片段像卡片一样翻转(左,右).当前片段消失翻转时,它会显示背面.再次单击该按钮后,它会再次翻转到前面,但前面片段上的ImageView消失了.
我尝试过保存所选图像数据的不同方法.
>保存碎片onSaveInstanceState
这给了我一个空指针,所以我想我创建后需要一些更恒定的东西.
>所以现在我将图像保存到SDCard一次
这个我认为可行,只需检查路径并抓住它,如果它翻转到前面或重新创建活动.
这是一些代码
的onCreate():
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.new_postcard_activity); //UI call frontimageView = (ImageView) findViewById(R.id.imageView); Log.d(tag,"onCreate() Instance:" + savedInstanceState); //fragment start if (savedInstanceState == null) { Log.d(tag,"Instance Null"); getFragmentManager() .beginTransaction() .add(R.id.postcardFrame,new CardFrontFragment()) .commit(); if(!mShowingBack){ Log.d(tag,"Not showing back"); if(newPath != null && newPath != ""){ Log.d(tag,"entered new path,not empty"); Drawable drawable = Drawable.createFromPath(newPath); Log.d(tag,"Should be setting saved image."); frontimageView.setimageDrawable(drawable); } } } else { mShowingBack = (getFragmentManager().getBackStackEntryCount() > 0); Log.d(tag,"Instance is not Null"); }
翻转按钮单击“侦听器”
//flip card final Button cardBackButton = (Button) findViewById(R.id.cardBackButton); cardBackButton.setonClickListener(new Button.OnClickListener(){ @Override public void onClick(View v) { flipCard(); });
flipCard方法:
private void flipCard() { Log.d(tag2,"Log after flipCard:" + mShowingBack); if(mShowingBack) { //Flip to front flipFront(); return; } // Flip to back flipBack(); }
我从他们的Photogallery中设置了Image onActivityResult
protected void onActivityResult(int requestCode,int resultCode,Intent intent) { super.onActivityResult(requestCode,resultCode,intent); if (resultCode == RESULT_OK) { Uri photoUri = intent.getData(); if (photoUri != null) { try { ImageView setimage = (ImageView)findViewById(R.id.imageView); frontimage = MediaStore.Images.Media.getBitmap(this .getContentResolver(),photoUri); imageset = true; //save image to SD if(imageset == true){ Log.d(tag,"Inside Image Set if Statement"); String path = getExternalCacheDir() + "Postcards.png"; if(path != null && path != ""){ Log.d(tag,"Path is:" + path); File file = new File(path); newPath = file.getAbsolutePath(); Log.d(tag,"New Path:" + newPath); if(file.exists()){ Log.d(tag,"File Exists"); Drawable d = Drawable.createFromPath(newPath); setimage.setimageDrawable(d); }else{ try{ Log.d(tag,"File didnt exist"); FileOutputStream out = new FileOutputStream(file); frontimage.compress(Bitmap.CompressFormat.PNG,90,out); if(file.exists()){ Log.d(tag,"file exists Now"); newPath = file.getAbsolutePath(); Drawable b = Drawable.createFromPath(newPath); setimage.setimageDrawable(b); } }catch(Exception e){ e.printstacktrace(); } } } } } catch (Exception e) { e.printstacktrace(); }
这是我访问图像并尝试在Restart()上将其设置为我的ImageView的方式
if(imageset == true){ if(newPath != null && newPath != ""){ ImageView view = (ImageView) findViewById(R.id.imageView); Drawable drawable = Drawable.createFromPath(newPath); view.setimageDrawable(drawable); } }
这似乎是获取图像和设置图像的最佳途径,但它不会工作.
什么是最佳实践,如何让它以我需要的方式执行?
非常感谢任何帮助!
解决方法
onSaveInstanceState (Bundle):
This method is called before an activity may be killed so that when it
comes back some time in the future it can restore its state
而且,在您的特定情况下,甚至可能不需要它.单击按钮,您将更改片段,而不是重新启动应用程序.
从我所看到的,你让用户创建一张明信片:一面是图片(比如A面),另一面是消息(比如说B面).当应用程序启动时,A侧即可查看.在某种程度上,您让用户从图库中选择一个图像.我将假设onActivityResult(int,int,Intent)按预期工作,并将图像设置为ImageView – R.id.imageView.单击按钮时,视图将更改为B侧.再次单击该按钮时,视图将更改为A面,但用户选择的图像不存在.
你可以在onActivityResult(int,Intent)中做的一件事是:在SharedPreferences中保存图像的路径.
SharedPreferences preferences; final String PREFS = "your.application.name.prefs"; // Keyword to find the path final String IMAGE_SELECTED_BY_USER = "image_selected_by_user"; // Use a default image when the user starts the app for the first time // or if the retrieved path points to a deleted image etc. final String PATH_TO_A_DEFAULT_IMAGE = "path_to_a_default_image" @Override protected void onCreate(Bundle savedInstanceState) { .... .... preferences = getActivity().getSharedPreferences(PREFS,0); imagePath = preferences.getString(IMAGE_SELECTED_BY_USER,PATH_TO_A_DEFAULT_IMAGE); frontimageView = (ImageView) findViewById(R.id.imageView); Drawable drawable = null; if (new File(imagePath).exists()) { drawable = Drawable.createFromPath(imagePath); } else { drawable = Drawable.createFromPath(PATH_TO_A_DEFAULT_IMAGE); } frontimageView.setimageDrawable(drawable); getFragmentManager() .beginTransaction() .add(R.id.postcardFrame,new CardFrontFragment()) .commit(); .... .... }
在onActivityResult(int,Intent)中,保存图像路径:
if(file.exists()){ Log.d(tag,"File Exists"); Drawable d = Drawable.createFromPath(newPath); setimage.setimageDrawable(d); Editor editor = preferences.edit(); editor.putString(IMAGE_SELECTED_BY_USER,newPath); editor.commit(); } else{ try{ Log.d(tag,"File didnt exist"); FileOutputStream out = new FileOutputStream(file); frontimage.compress(Bitmap.CompressFormat.PNG,out); if (file.exists()) { Log.d(tag,"file exists Now"); newPath = file.getAbsolutePath(); Drawable b = Drawable.createFromPath(newPath); setimage.setimageDrawable(b); Editor editor = preferences.edit(); editor.putString(IMAGE_SELECTED_BY_USER,newPath); editor.commit(); } } catch (Exception e) { e.printstacktrace(); } }
这样,当用户启动应用程序时,他/她将看到默认图像或先前选择的图像.
其中savedInstanceState很有用:假设你给用户一个在B面写短信的选项.现在,如果在写消息时,用户将设备从Landscape旋转到Portrait(反之亦然),那么消息他就是/她写的将会消失,因为活动将被销毁并重新创建.要保存消息,可以使用onSaveInstanceState(Bundle):
@Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putString("Text_To_Save",someEditText.getText().toString()); }
轮换时,将调用活动的onCreate(Bundle)’.传递的包与fromSaveInstanceState(Bundle)`相同.要检索文本:
String savedString = ""; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (savedInstanceState != null) { if (savedInstanceState.contains("Text_To_Save")) { savedString = savedInstanceState.getString("Text_To_Save"); } } someEditText.setText(savedString); }
Android Studio – 使用依赖于另一个Android库的Android库构建Android项目
我需要使用Gradle构建一个依赖于Android库项目A的Android项目,该项目取决于另一个Android库项目B.
到目前为止,我有以下内容:
Android项目:
的build.gradle:
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.5.+'
}
}
apply plugin: 'android'
dependencies {
compile project(':LibA')
}
android {
compileSdkVersion 7
buildToolsversion "17.0.0"
}
manifest.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.cyborg.template"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="7"
android:targetSdkVersion="7" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:name="com.cyborg.template.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>
Android库A:
的build.gradle:
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.5.+'
}
}
apply plugin: 'android-library'
dependencies {
compile project(':LibB')
}
android {
compileSdkVersion 7
buildToolsversion "17.0.0"
}
manifest.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.lib.project.a"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk
android:minSdkVersion="7"
android:targetSdkVersion="7"/>
</manifest>
Android库B:
的build.gradle:
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.5.+'
}
}
apply plugin: 'android-library'
android {
compileSdkVersion 7
buildToolsversion "17.0.0"
}
manifest.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.lib.project.b"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk
android:minSdkVersion="7"
android:targetSdkVersion="7"/>
</manifest>
在尝试构建Android项目时,Android studio报告了以下错误:
Gradle: Execution Failed for task ':LibA:processDebugManifest'.
> Manifest merging Failed. See console for more info.
那个控制台在哪里我想搜索有关错误的更多信息?
我发现了一些关于这个错误的问题,但它似乎与我的情况不一样.
启示?
谢谢,
亚当.
解决方法:
该库的清单文件当前必须具有< application />节点,即使它是空的.
这是我们将在某些时候删除的限制,但现在,只需添加它.
Android Studio:在片段类中生成饼图(MPAndroidChart)返回黑屏
如何解决Android Studio:在片段类中生成饼图(MPAndroidChart)返回黑屏?
我正在尝试生成由 MPAndroidChart 提供的 PieChart。 网上大部分例子都是在MainActivity类中实现图表的,但是我想在片段类中使用。
这是代码
public class AssessmentFragment extends Fragment {
private TextView assessment_result;
private PieChart pieChart;
private PieData pieData;
private PieDataSet pieDataSet;
private ArrayList pieEntries;
private ArrayList PieEntryLabels;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater,@Nullable ViewGroup container,@Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_assessment,container,false);
return view;
}
@Override
public void onViewCreated(View view,@Nullable Bundle savedInstanceState) {
assessment_result = getView().findViewById(R.id.assessment_result);
assessment_result.setText("Your favorite restaurant status: " + Utils.Status(User.favrest(),//Ignore these two lines when you try this code.
pieChart = getView().findViewById(R.id.piechart);
getEntries();
pieDataSet = new PieDataSet(pieEntries,"");
pieData = new PieData(pieDataSet);
pieChart.setData(pieData);
pieDataSet.setColors(ColorTemplate.JOYFUL_COLORS);
pieDataSet.setSliceSpace(2f);
pieDataSet.setValueTextColor(Color.WHITE);
pieDataSet.setValueTextSize(10f);
pieDataSet.setSliceSpace(5f);
}
private void getEntries() {
pieEntries = new ArrayList<>();
pieEntries.add(new PieEntry(2f,0));
pieEntries.add(new PieEntry(4f,1));
pieEntries.add(new PieEntry(6f,2));
pieEntries.add(new PieEntry(8f,3));
pieEntries.add(new PieEntry(7f,4));
pieEntries.add(new PieEntry(3f,5));
}
}
这就是我在 fragment_assessment.xml 中调用饼图的方式
<view
android:id="@+id/piechart"android:layout_width="32dp"
android:layout_height="203dp"
android:layout_weight="1" />
当我运行它时,它显示黑屏并返回主页面,如果我再次尝试,则会返回错误消息。 我也尝试在 onCreateView 中放入关于饼图的代码,结果也是一样的情况(黑屏)。 生成 PieChart 的代码没有错,在 MainActivity 中有效。
我应该在哪里修改才能使这个工作? 或者你们能展示一个在片段中生成饼图的例子吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)
android – ViewPager片段 – 片段未显示
我试图使用viewpager来显示几个片段.目前我只有一个片段,但它似乎永远不会被实例化.我尝试使用pager.setCurrentItem(0),但永远不会调用适配器中的getItem方法.有谁知道为什么我的片段没有加载到下面的代码?
主要活动
public class MainActivity extends SherlockFragmentActivity {
MyPagerAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate( savedInstanceState );
setContentView( R.layout.activity_main );
// Create the FragmentPager Adapter and assign it to the viewpager
adapter = new MyPagerAdapter( getSupportFragmentManager(),this );
ViewPager pager = ( ViewPager ) findViewById( R.id.pager );
pager.setAdapter( adapter );
pager.setCurrentItem( 0 );
// Setup the tab page indicator
TabPageIndicator indicator = ( TabPageIndicator ) findViewById( R.id.indicator );
indicator.setViewPager( pager );
}
class MyPagerAdapter extends FragmentStatePagerAdapter {
private SparseArray
MainActivity布局
ScheduleListFragment
public class ScheduleListFragment extends SherlockListFragment implements ViewPagerPage {
private ScheduleAdapter adapter;
private final String TITLE = "Schedule";
public static ScheduleListFragment newInstance() {
ScheduleListFragment newFrag = new ScheduleListFragment();
Bundle args = new Bundle();
newFrag.setArguments( args );
return newFrag;
}
public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {
return inflater.inflate( R.layout.fragment_schedule_list,null );
}
@Override
public void onCreateOptionsMenu(Menu menu,MenuInflater inflater) {
inflater.inflate( R.menu.fragment_schedule_list,menu );
}
// Container Activity must implement this interface
public interface OnAddItemClickedListener {
public void onAddItemClicked();
}
@Override
public boolean onoptionsItemSelected(MenuItem item) {
// Handle item selection
switch ( item.getItemId() ) {
case R.id.add_item:
Intent myIntent = new Intent( getActivity(),AddScheduleItemActivity.class );
startActivityForResult( myIntent,1 );
return true;
default:
return super.onoptionsItemSelected( item );
}
}
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated( savedInstanceState );
setHasOptionsMenu( true );
adapter = new ScheduleAdapter( getActivity() );
setlistadapter( adapter );
}
private class SampleItem {
public String tag;
public int iconRes;
public SampleItem(String tag,int iconRes) {
this.tag = tag;
this.iconRes = iconRes;
}
}
public class ScheduleAdapter extends ArrayAdaptertimageResource( getItem( position ).iconRes );
TextView title = ( TextView ) convertView.findViewById( R.id.row_title );
title.setText( getItem( position ).tag );
return convertView;
}
}
@Override
public String getTitle() {
return TITLE;
}
@Override
public void onActivityResult(int requestCode,int resultCode,Intent data) {
if ( resultCode == android.app.Activity.RESULT_OK ) {
String name = ( String ) data.getExtras().get( "TEXT" );
Toast.makeText( getActivity(),name,Toast.LENGTH_LONG ).show();
}
}
片段布局
谢谢,
弥敦道
现有解决方案
更改了适配器构造函数以初始化第一个片段并将其添加到内部映射.有没有人看到这样做有什么问题,或者改进上面发布的任何代码?谢谢!
public MyPagerAdapter(FragmentManager fm,Activity context) {
super( fm );
fragmentPageMap = new SparseArray
最佳答案
getCount()在MyPagerAdapter中返回0,因此不会创建片段,如果要实例化N片段,它应返回N.
fragmentPageMap是在构造函数中创建的,当调用getCount()并在getItem(index)之前调用getCount()时为空,这就是getCount()返回0的原因
在这种情况下,您不需要切换,因为您每次都要实例化相同的Fragment.但是,如果您在实例化不同的碎片,那么您将需要它.
@Override
public Fragment getItem(int index) {
switch (index) {
case 0:
return new Fragment1();
case 1:
return new Fragment2();
}
return null;
}
android – 一些片段在旋转时丢失
我尝试使用这个重新创建的片段
mFragment = getSupportFragmentManager().findFragmentById(R.id.fragment_frame);
并把它放到新的布局
getSupportFragmentManager().beginTransaction() .replace(R.id.fragment_frame,mFragment ) .commit();
但遇到奇怪的行为:丢失了几个碎片.它们不会更多地显示在屏幕上.在他们的位置是空的.
虽然日志显示片段重新创建正常,但进一步显示片段再次被破坏,再次创建和销毁.
我为展示问题建立了更清晰,没有外壳的测试项目.
并且有明显的结果(插入图片的声誉不够)
Activity started picture
Activity rotated picture
A,B,C,D是片段
正如您在配置更改后看到的那样,一些片段丢失了(B,D)
告诉我我做错了什么
这是帮助的代码(编辑:将代码推送到gitHub以便更容易尝试)
https:// github.com/nailgilaziev/TestFragmentsRetain
p / s抱歉链接
旋转设备后,这里记录猫
MainActivity: onPause Activity MainActivity: onStop Activity MainActivity: onDestroy Activity A: onDestroyview A: onDestroy B: onDestroyview B: onDestroy C: onDestroyview C: onDestroy D: onDestroyview D: onDestroy MainActivity: onCreate Activity A: onCreate B: onCreate C: onCreate D: onCreate MainActivity: replaced MainActivity: onStart Activity A: onCreateView B: onCreateView C: onCreateView D: onCreateView <--before this point all fine and then strange behavior began for the lost fragments(B,D) are performed unnecessary calls--> B: onDestroyview B: onDestroy D: onDestroyview D: onDestroy D: onCreate D: onCreateView MainActivity: onResume Activity
解决方法
基本上,当方向更改时,您的Fragments将自动重新附加,因此每次调用onCreate(Bundle)时都不需要执行FragmentTransaction.
你应该在onCreate(Bundle)上做什么呢……
> Null检查传入onCreate(Bundle)的savedInstanceState Bundle. – 如果发生方向更改,则再次调用onCreate(Bundle)并且savedInstanceState Bundle将变为非null. FragmentActivity在重新创建之前将数据保存在onSaveInstanceState(Bundle)中.
>如果savedInstanceState为null,则创建片段并通过FragmentTransaction附加它们.否则,什么也不做.
总之,您修改后的代码应该类似于以下内容……
FragmentManager fm = getSupportFragmentManager(); if(savedInstanceState == null) { fm.beginTransaction() .replace(R.id.a,new A()) .replace(R.id.b,new B()) .replace(R.id.c,new C()) .replace(R.id.d,new D()) .commit(); } else { a = fm.findFragmentById(R.id.a); b = fm.findFragmentById(R.id.b); c = fm.findFragmentById(R.id.c); d = fm.findFragmentById(R.id.d); }
另外,请注意,Fragment的onCreate(Bundle)方法中的savedInstanceState Bundle将始终为null,除非您在onSaveInstanceState(Bundle)中保存了一些内容,因此不要假设saveInstanceState在片段中也是非null的当它被重新创建时,就像FragmentActivity的情况一样.
关于android – 片段翻转和丢失图像和android翻转动画的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于Android Studio – 使用依赖于另一个Android库的Android库构建Android项目、Android Studio:在片段类中生成饼图(MPAndroidChart)返回黑屏、android – ViewPager片段 – 片段未显示、android – 一些片段在旋转时丢失的相关信息,请在本站寻找。
本文标签: